Неправильна поведінка сортування команди?


14

Я спробував сортувати вміст файлу на робочому столі Ubuntu 14.04 (Trusty Tahr). У моєму випадку очікуваний результат повинен бути таким же, як оригінальний вміст, але фактичний результат - ні. Чому?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
Я вручаю вам невеликий нагородний трофей за ваше марне використанняcat .
Девід Фоерстер

3
Коментар @DavidFoerster - це смішний спосіб вказати, що ви можете замінити cat test.txt | sortйого sort test.txt:)
Volker Siegel

@VolkerSiegel: Правда, хоча catдля запуску є корисні рецептури . Наприклад, cat FILE | grep dev | sortбудуть відображатися лише рядки з "dev" в них (у відсортованому порядку). Використання sort FILE | grep devдає такий же вихід, але кольоровий.
AlainD

Відповіді:


17

Ви можете використовувати LC_ALLзмінну, встановити її LC_ALL=Cперед викликомsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Прочитайте цю відповідь, якщо хочете дізнатися, що це магічно LC_ALL=C. Ось короткий підсумок:

Локал C - це спеціальна мова, яка має бути найпростішою мовою. Ви також можете сказати, що хоча інші локальні місця для людей, мова C є для комп'ютерів. У мові C символи - це одиничні байти, діаграма - ASCII, порядок сортування базується на байтових значеннях.

Також, як вказував @KenMollerup, цитата з man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Тому при використанні сортування з LC_ALL=Cсортуйте порівняння символів побічно. В іншому випадку sortбуде проігноровано всі буквено-цифрові символи.


Вибачте, що не бачив цього, я відреагував на коментар!
Кен Моллеруп

Дякую @KenMollerup за вказівку на man sort. Я цього не помічав
c0rp

8

Сортування використовує алфавітне та числове сортування, так само, як і нас, спеціальні символи на зразок + - <> ... ігноруються, числа обробляються числовими, так що 1, 2, 3 .. приходить до 11, 12 1066 1104 - дивіться!

Тож ваш список розглядається як: aa, ab, ab, ac, ac


Чи є варіант для сортування, такий, що він не буде ігнорувати спеціальні символи, такі, що test.txt буде сортувати потрібний спосіб?
Doug Smythies

6
Дивіться це у сорті людини: *** ПОПЕРЕДЖЕННЯ *** Місцевість, визначена середовищем, впливає на порядок сортування. Встановіть LC_ALL = C, щоб отримати традиційний порядок сортування, який використовує нативні значення байтів.
Кен Моллеруп

@KenMollerup, будь ласка, додайте більше інформації до своєї відповіді. Додайте цитату man sort, додайте приклади.
c0rp

Так, але я був занадто повільним, дивіться відповідь c0rp нижче.
Кен Моллеруп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.