ОБНОВЛЕННЫЙ ОТВЕТ:
ПРОБЛЕМА:
ОП получает сообщение об ошибке « файл не в отсортированном порядке » при 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 :
40
110000
2200
6
33000
file2.txt :
2200
40
33000
6
440000
Пересечение :
Перечислите только числа, общие для ОБА файлов
Без -n
выключателя:
comm -12 <(sort file1.txt) <(sort file2.txt)
2200
33000
40
6
Результаты : правильные, но возвращенные в несортированном порядке
С -n
переключателем:
comm -12 <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
comm: file 1 is not in sorted order
Результаты : правильные, но возвращенные в порядке сортировки LEXOGRAPHIC . Операция завершилась успешно и вернула те же результаты, что и при использовании comm
без -n
переключателя, но в отсортированном списке.
Разница :
Перечислите только числа, уникальные для каждого файла:
Без -n
выключателя:
comm -3 <(sort file1.txt) <(sort file2.txt)
110000
440000
Результаты : Правильно - эти числа действительно являются исключительными для каждого соответствующего файла.
С -n
переключателем:
comm -3 <(sort -n file1.txt) <(sort -n file2.txt)
110000
comm: file 1 is not in sorted order
440000
Результаты : правильные, те же результаты, что и comm
без -n
переключателя, но возвращает ошибку о порядке сортировки натуральных чисел в самих файлах.
РЕШЕНИЕ ДЛЯ ЛЕКСОГРАФИЧЕСКИХ РЕЗУЛЬТАТОВ:
Используйте переключатель comm
`s --nocheck-order
для подавления сообщения об ошибке. Поскольку мы знаем, что числа не отсортированы в каждом файле, но возвращаемые результаты comm -n
верны, ошибку можно смело игнорировать, подавляя ее:
Пересечение :
comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
6
40
2200
33000
Разница :
comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)
110000
440000
ВЫВОД:
Ошибка « файл не в отсортированном порядке », когда возвращаются отсортированные положительные целые числа comm
, не означает, что результаты, возвращаемые с помощью -n
переключателя с comm
, неверны. Действительно, использование comm -n
возвращает правильный порядок в отсортированном порядке!
Спасибо @dhag, @kusalananda @ChrisDown за то, что подняли вопросы, требующие дальнейшего расширения. Всегда рады тому, что мои работы проверены: единственный способ, которым мы можем стать лучше, - это если мы постоянно сталкиваемся с трудностями наших коллег.