соединение: “Файл 2 не в отсортированном порядке”

Я думаю, на основе моего собственного опыта и ответов здесь, Вы больше ищете комплект приложений и инструментов, которые сделают разработку легче и более практичной.

Прохладная вещь о Linux состоит в том, что любое распределение очень легко настроить. Я рекомендовал бы найти список программного обеспечения, которое Вы чаще всего используете при разработке и делаете большой tarball, который можно принести с компьютера на компьютер (при переключении рабочих областей много).

12
05.11.2013, 23:37
7 ответов

Я получил ту же ошибку с Ubuntu 11.04, с sort и join оба в версии (GNU coreutils) 8.5.

Они являются явно несовместимыми. На самом деле sort команда кажется с ошибками: нет никакого различия с или без -f (--ignore-case) опция. При сортировке, aaB всегда прежде aBa. Не алфавитно-цифровые символы кажется также всегда игнорируемым (abc прежде ab-x)

Соединение, кажется, ожидает противоположное... Но у меня есть решение

На самом деле это связано с сортирующей последовательностью: использование LANG=en_EN sort -k 1,1 <myfile> ... затем LANG=en_EN join ... устраняет сообщение.

Интернационализация является корнем зла... (никто не документирует его ясно).

24
27.01.2020, 19:54
  • 1
    Так, если оба использования LANG=en_EN, затем это будет определенно работать? Это будет работать на какую-либо локаль, пока оба используют ту же локаль? Мы можем сказать что различие между sort и join это, они используют другую локаль по умолчанию? –  Aaron McDaid 25.08.2014, 18:19
  • 2
    -k опция ответ здесь, или это LANG=en_EN? Неясно из того, что точное решение здесь. –  User 21.07.2016, 02:12

Для соединения аргументом после-t является символ. Для вида можно предоставить более длинный разделитель вида. Я думаю, что можно присоединяться к файлам на другом поле, что Вы хотите, и игнорирование регистра решает проблему по совпадению.

И я соглашаюсь с Gilles, те демонстрационные данные были бы полезны.

1
27.01.2020, 19:54

Вы сортировали с числами? Я нашел, что дополнение нуля столбец, что я присоединялся на решенном к этой проблеме для меня.

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt
5
27.01.2020, 19:54

Если Вы уверены, что правильно отсортировали свои входные файлы, и их строки могут быть соединены, можно избежать вышеупомянутой ошибки путем выполнения join --nocheck-order file1.txt file2.txt

5
27.01.2020, 19:54

sort значением по умолчанию использует всю строку в качестве ключа

join использование только указанное поле как ключ.

Необходимо исправить эту несовместимость путем ограничения вида для использования только ключа, на котором Вы хотите присоединиться.

Состояния страницы справочника Соединения:

Важный: FILE1 и FILE2 должны быть отсортированы на объединяющих полях. Например, используйте 'вид-k 1b, 1', если> 'соединение' не имеет никаких опций. Примечание, сравнения соблюдают правила, указанные 'LC_COLLATE'. Если> вход не будет отсортирован, и к некоторым строкам нельзя присоединиться, то предупреждающее сообщение будет дано.

4
27.01.2020, 19:54
LOCALE=C sort ...
LOCALE=C join ...

Это решит вашу проблему. Проблема, как указывает @Michael, заключается в последовательности сопоставления, которая зависит от вашей настройки LOCALE.

2
27.01.2020, 19:54

Обратите внимание, что если вы видите эту ошибку, и вы уже отсортировали по определенному колонка и бьетесь головой о стену например sort -k4,4, тогда вам также может понадобиться установить разделитель для команды сортировки

По-видимому, OP уже сделал это с -t ' ', но для обычного текста, разделенного табуляцией, я бы рекомендовал

sort -t $'\t' ...

Команда сортировки может включать пробелы в качестве разделителей по умолчанию даже в том, что выглядит как файл, разделенный табуляцией (особенно если внутри столбца, по которому вы сортируете, есть пробелы).

Затем, если вы передали эти отсортированные данные для соединения, и у вас есть

join -t $'\t' ...

, то это приводит к появлению сообщения об ошибке о том, что они не отсортированы. Как отмечалось выше, join может не принимать -t ' '.

4
27.01.2020, 19:54

Теги

Похожие вопросы