ОНОВЛЕНА ВІДПОВІДЬ:
ПРОБЛЕМА:
ОП отримує помилку про " файл не впорядкованому порядку " при використанні 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 підняв проблеми, які потребували подальшого розширення. Завжди радий переглядати мою роботу: єдиний спосіб, коли ми можемо покращитись, це якщо ми постійно підштовхуємось і кидаємо виклик нашим колегам.