comm: файл не в отсортированном порядке

9

Я использовал commдля сравнения двух отсортированных файлов. Каждая строка в этих файлах - положительные целые числа. Но результаты показывают

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Почему происходит ошибка, даже если эти два файла отсортированы?

wenzi
источник
В моем случае я отсортировал (по лексикографическому возрастанию) файлы, используя notepad ++, который рассматривает строчные буквы и заглавные буквы отдельно, например. a появится после 'Z' в порядке возрастания. Это отличается от сортировки утилит (bash). Чтобы убедиться в этом, я перевел все строки в верхний регистр, а затем отсортировал их в np ++, comm больше не жаловался.
Сахил Сингх

Ответы:

10

commтребуется лексикографическая сортировка (обычная sort), а не числовая ( sort -n). Например, он хочет следующий порядок:

1
2000
300

Не следующий порядок:

1
300
2000

Исправьте это, и проблема должна исчезнуть. Для более эзотерических случаев , когда comm«S локаль может отличаться , чем sortместности, вы можете работать sortи commс LC_COLLATE=Cв их среде , чтобы использовать родной порядок байт.

Крис Даун
источник
как заставить это делать числовую сортировку?
Вензи
4
@wenzisort -n
Жиль "
« Лексографический порядок » - это то, где последовательность чисел УВЕЛИЧИВАЕТСЯ в упорядоченных сериях - вы ответили в обратном порядке в своем ответе: mathworld.wolfram.com/LexicographicOrder.html . Пожалуйста , обратитесь к результатам тестов моего ответа ниже, который сравнивает использование sort с и без на -nкоммутаторе и демонстрирует только с на -nпереключателе вы можете добиться правильного увеличения заказа вы подтверждаете , требуется свой собственный ответ.
F1Linux
@ F1Linux Что? commБуквально требует LC_COLLATEd порядка. Достаточно сказать, что ошибки в вашем ответе не являются чисто косметическими для примеров за пределами вашего тестового набора ... никто не просил положительного числового рода.
Крис Даун
@ChrisDown Ваш ответ, на который я ответил, а не тот, который я вижу, вы только что отредактировали, и только сейчас СЕЙЧАС упоминается, что « LC_COLLATE » гласил : « comm хочет буквально- литографическую сортировку, а не числовую сортировку. Исправьте это, и проблема должна исчезнуть». Теперь где в "LC_COLLATE" было что-то, что сильно отличается от "_Lexographic". Действительно, ваш первоначальный ответ был настолько скудным, в одной строке без ПРИМЕРОВ, что побудило меня вернуться к вопросу с моим собственным ответом. Я поддерживаю ваш обновленный ответ, потому что здесь, как вы заметили, определенно действует LC_COLLATE.
F1Linux
0

ОБНОВЛЕННЫЙ ОТВЕТ:

ПРОБЛЕМА:

ОП получает сообщение об ошибке « файл не в отсортированном порядке » при 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 за то, что подняли вопросы, требующие дальнейшего расширения. Всегда рады тому, что мои работы проверены: единственный способ, которым мы можем стать лучше, - это если мы постоянно сталкиваемся с трудностями наших коллег.

F1Linux
источник
В ответе, получившем наибольшее количество голосов, упоминается, что «comm хочет лексикографическую сортировку», но, похоже, вы сортируете численно. Похоже, что он упадет в некоторых случаях.
Даг
Проверьте снова с числами, которые сортируются по-разному численно и лексикографически, например, 1000, 200, 30, 4.
Кусалананда
@Kusalananda Просто включил ваши очень добрые и полезные отзывы в мой обновленный ответ. Самые благодарные за ваш отзыв!
F1Linux
@dhag только что обновил мой ответ, чтобы включить ваши и отзывы Кусаланада. Самые благодарные вам, ребята, которые
потратили
1
@JeffSchaller В ответе, на который я первоначально ответил, упоминается «Lexographic», а не «LC_COLLATE», как в недавно исправленном ответе Криса. Я ответил Крису, что это правильно, и проголосовал за его обновленный ответ. "Lexographic" и "LC_COLLATE" - разные звери. Спасибо Джефф-
F1Linux