Я использовал comm
для сравнения двух отсортированных файлов. Каждая строка в этих файлах - положительные целые числа. Но результаты показывают
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
Почему происходит ошибка, даже если эти два файла отсортированы?
sort
comm
numeric-data
wenzi
источник
источник
Ответы:
comm
требуется лексикографическая сортировка (обычнаяsort
), а не числовая (sort -n
). Например, он хочет следующий порядок:Не следующий порядок:
Исправьте это, и проблема должна исчезнуть. Для более эзотерических случаев , когда
comm
«S локаль может отличаться , чемsort
местности, вы можете работатьsort
иcomm
сLC_COLLATE=C
в их среде , чтобы использовать родной порядок байт.источник
sort -n
sort
с и без на-n
коммутаторе и демонстрирует только с на-n
переключателе вы можете добиться правильного увеличения заказа вы подтверждаете , требуется свой собственный ответ.comm
Буквально требуетLC_COLLATE
d порядка. Достаточно сказать, что ошибки в вашем ответе не являются чисто косметическими для примеров за пределами вашего тестового набора ... никто не просил положительного числового рода.ОБНОВЛЕННЫЙ ОТВЕТ:
ПРОБЛЕМА:
ОП получает сообщение об ошибке « файл не в отсортированном порядке » при
comm
сравнении положительных целых чисел в файлах, а не текста. Итак, мы имеем дело с недесятичными числами.Короткий ответ:
В зависимости от использования
-n
переключателя сsort
командой, используемой для сортировки предоставленных результатовcomm
, порядок возвращаемых результатовcomm
может быть очень различным:Лексография : использование
-n
переключателя с сортировкой приведет к тому, что «положительные целые числа» будут упорядочены в серии возрастающих чисел. « Ошибка » может быть подавлена с помощьюcomm
ключа--nocheck-order
Порядок байтов : НЕТ использования
-n switch
сsort
.LC_COLLATE
определяет порядок, который может даже варьироваться в зависимости от того, какlocale
установлен на хосте, на котором выполняется команда. Это входcomm
ожидает по умолчанию. Немного больше оLC_COLLATE
можно найти здесь: Reference1 и Reference2Ошибка является проблемой? Это зависит от того, чего вы пытаетесь достичь. Как вы увидите в примерах ниже,
comm
возвращает те же результатыпосле сравнения файлов с или безsort
`S-n
выключателя, хотя их порядок будет меняться вышеописанным способомзависимости от того-n switch
используется сsort
командой. Сам я предпочитаю «лексографические» упорядоченные результаты - числа, которые увеличиваются в серии.Однако если вам не нужны результаты в « лексографическом » порядке, НЕ используйте
-n
переключатель при сортировке данных, предоставленныхcomm
для сравнения.ИСПЫТАНИЯ:
Мы сравним результаты
comm
команды с-n
переключателем и без него . Я увеличил сложность моего набора данных для испытаний образцов по запросу Кусалананды:Тестовые данные :
file1.txt :
file2.txt :
Пересечение :
Перечислите только числа, общие для ОБА файлов
Без
-n
выключателя:Результаты : правильные, но возвращенные в несортированном порядке
С
-n
переключателем:Результаты : правильные, но возвращенные в порядке сортировки LEXOGRAPHIC . Операция завершилась успешно и вернула те же результаты, что и при использовании
comm
без-n
переключателя, но в отсортированном списке.Разница :
Перечислите только числа, уникальные для каждого файла:
Без
-n
выключателя:Результаты : Правильно - эти числа действительно являются исключительными для каждого соответствующего файла.
С
-n
переключателем:Результаты : правильные, те же результаты, что и
comm
без-n
переключателя, но возвращает ошибку о порядке сортировки натуральных чисел в самих файлах.РЕШЕНИЕ ДЛЯ ЛЕКСОГРАФИЧЕСКИХ РЕЗУЛЬТАТОВ:
Используйте переключатель
comm
`s--nocheck-order
для подавления сообщения об ошибке. Поскольку мы знаем, что числа не отсортированы в каждом файле, но возвращаемые результатыcomm -n
верны, ошибку можно смело игнорировать, подавляя ее:Пересечение :
Разница :
ВЫВОД:
Ошибка « файл не в отсортированном порядке », когда возвращаются отсортированные положительные целые числа
comm
, не означает, что результаты, возвращаемые с помощью-n
переключателя сcomm
, неверны. Действительно, использованиеcomm -n
возвращает правильный порядок в отсортированном порядке!Спасибо @dhag, @kusalananda @ChrisDown за то, что подняли вопросы, требующие дальнейшего расширения. Всегда рады тому, что мои работы проверены: единственный способ, которым мы можем стать лучше, - это если мы постоянно сталкиваемся с трудностями наших коллег.
источник