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


9

Я commпорівнював два відсортовані файли. У кожному рядку цих файлів є додатні цілі числа. Але результати показують

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

Як приходить помилка, навіть якщо ці два файли відсортовано?


У моєму випадку я сортував (лексикографічне зростання) файли за допомогою блокнота ++, який розглядає малі літери і великі літери, наприклад. a з'явиться після "Z" у порядку зростання. Це відрізняється від сортування утиліти (bash) сортування. Щоб підтвердити це, я перетворив усі рядки у верхній регістр, а потім відсортував у np ++, comm більше не скаржився.
Сахіл Сінгх

Відповіді:


10

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

1
2000
300

Не такий порядок:

1
300
2000

Виправте це, і проблема повинна піти. Для інших езотеричних випадків, коли commлокал може відрізнятися від sortлокального, ви можете запустити sortі commз LC_COLLATE=Cїх середовищем використовувати впорядковані байти.


як змусити це зробити числове сортування?
Вензі


« Lexographic замовлення », де ряд чисел ПІДВИЩЕННЯ в упорядкованому seeries- ви отримали його назад в своїй відповіді: mathworld.wolfram.com/LexicographicOrder.html . Будь ласка , зверніться до результатів тестів моєї відповіді нижче, який порівнює використання sort з і без на -nкомутаторі і демонструє тільки з на -nперемикачі ви можете добитися правильного збільшення замовлення ви підтверджуєте , потрібен свій власний відповідь.
F1Linux

@ F1Linux Що? commбуквально вимагає LC_COLLATEd замовлення. Досить сказати, що помилки у вашій відповіді не є чисто косметичними для прикладів поза тестовим набором ... ніхто не запитував позитивного числового сортування.
Кріс Даун

@ChrisDown Ваш відповідь, що я відповів на це - не той, кого я бачу, що ви щойно відредагували, і лише ЗАРАЗ згадує " LC_COLLATE ": " ком хоче буквальнелексографічне сортування, а не числове сортування. Виправте це, і проблема повинна піти ". Тепер де там було щось про "LC_COLLATE", який є зовсім іншим звіром, ніж сорт "_Lexographic". Дійсно, ваша початкова відповідь була настільки рідкою лише в одному рядку, ЯКІ НЕ ПРИКЛАДИ, що саме змусило мене переглянути питання за допомогою власної відповіді. Я підтримую вашу оновлену відповідь, оскільки "LC_COLLATE", безумовно, діє тут, як ви зазначили.
F1Linux

0

ОНОВЛЕНА ВІДПОВІДЬ:

ПРОБЛЕМА:

ОП отримує помилку про " файл не впорядкованому порядку " при використанні commдля порівняння натуральних чисел у файлах, а не в тексті. Отже, ми маємо справу з недесятковими числами.

Коротка відповідь:

Залежно від використання -nперемикача з sortкомандою, яка використовується для сортування результатів, що подаються comm, впорядкованість результатів, що повертаються, commможе бути дуже різною:

Лексографічний : Використання -nперемикача з сортуванням призведе до того, що "позитивні цілі" будуть впорядковані в ряд зростаючих чисел. " Помилку " можна придушити за допомогою commперемикача `s--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

Перехрестя :

Перерахуйте лише номери, загальні для файлів BOTH

Без -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 підняв проблеми, які потребували подальшого розширення. Завжди радий переглядати мою роботу: єдиний спосіб, коли ми можемо покращитись, це якщо ми постійно підштовхуємось і кидаємо виклик нашим колегам.


Відповідь, що голосує вгорі, згадує, що "кому хочеться лексикографічного сортування", але, здається, ви сортуєте числово. Схоже, в деяких випадках воно впаде.
даг

Перевірте ще раз цифри, які впорядковуються по-різному чисельно та лексикографічно, наприклад, 1000, 200, 30, 4.
Kusalananda

@Kusalananda Щойно включила ваші дуже добрі та корисні відгуки в мою оновлену відповідь. Більшість зобов’язані за ваш відгук!
F1Linux

@dhag щойно оновив мою відповідь, щоб включити ваші відгуки про Кусаланаду. Найбільше зобов’язані для вас, люди,
витрачаючи

1
@JeffSchaller У відповіді, на яку я спочатку відповів, згадувався про "лексографічний" сорт, а не "LC_COLLATE", як у нещодавно зміненій відповіді Кріса. Я відповів на Кріса, що це правильно, і підтримав його оновлену відповідь. "Лексографічні" та "LC_COLLATE" - це різні звірі. Дякую Jeff-
F1Linux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.