У меня есть два файла _jeter3.txt и _jeter1.txt
Я проверил, что они оба отсортированы по 20-му столбцу, используя sort -c
sort -t ' ' -c -k20,20 _jeter3.txt
sort -t ' ' -c -k20,20 _jeter1.txt
#no errors
но есть ошибка, когда я хочу, чтобы join
оба файла говорит, что второй файл не отсортирован:
join -t ' ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order
Я не понимаю почему.
cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0
ОБНОВЛЕНИЕ : использование ' sort -f
' и join -i
(без учета регистра) решает проблему. Но это не объясняет мою первоначальную проблему.
ОБНОВЛЕНИЕ : версии сортировки и присоединения:
> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
locale
.Ответы:
Я получил ту же ошибку с 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 ...
удаляет сообщение.Интернационализация - корень зла ... (никто не документирует это ясно).
источник
LANG=en_EN
, то это точно сработает? Будет ли это работать для любой локали, если обе используют одну и ту же локаль? Можно ли сказать , что разница междуsort
и вjoin
том , что они используют другую локаль по умолчанию?-k
вариант ответа или здесьLANG=en_EN
? Неясно, какое точное решение здесь.Вы сортировали по номерам? Я обнаружил, что заполнение нулями столбца, к которому я присоединяюсь, решило эту проблему для меня.
источник
Если вы уверены, что правильно отсортировали свои входные файлы и их строки могут быть соединены, вы можете избежать вышеуказанной ошибки, запустив
join --nocheck-order file1.txt file2.txt
источник
sort
по умолчанию в качестве ключа используется вся строкаjoin
использует только указанное поле в качестве ключа.Вы должны исправить эту несовместимость, ограничив сортировку только тем ключом, к которому вы хотите присоединиться.
Страница руководства Присоединиться заявляет:
источник
Это решит вашу проблему. Проблема, как указал @Michael, заключается в последовательности сортировки, которая зависит от настроек LOCALE.
источник
Обратите внимание, что если вы видите эту ошибку, и вы уже отсортировали по конкретному столбцу и бьете головой об стену, например, sort -k4,4, то вам также может понадобиться установить разделитель для команды sort
Очевидно, OP уже сделал это с -t '', но для обычного текста, разделенного табуляцией, я бы порекомендовал
Команда сортировки может включать пробелы в качестве разделителей по умолчанию даже для чего-то, что выглядит как разделенный табуляцией файл (особенно если в столбце, по которому вы сортируете, есть пробелы).
Затем, если вы передали эти отсортированные данные, чтобы присоединиться, и у вас есть
Затем это приводит к тому, что сообщение об ошибке не сортируется. Как отмечалось выше, join может не принимать -t ''.
источник
Для объединения аргумент после -t является символом. Для сортировки вы можете поставить более длинный разделитель сортировки. Я думаю, что вы можете присоединять файлы в другом поле, которое хотите, и игнорирование регистра решает проблему по совпадению.
И я согласен с Жилем, что примеры данных будут полезны.
источник