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