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


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. Я не заметил этого
crrp

8

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

Таким образом, ваш список выглядит как: аа, а-а, а-а-а-а-а


Есть ли какая-либо опция для сортировки, чтобы она не игнорировала специальные символы, чтобы test.txt сортировал желаемый путь?
Даг Смитис

6
Смотрите это в man sort: *** WARNING *** Локаль, указанная средой, влияет на порядок сортировки. Установите LC_ALL = C, чтобы получить традиционный порядок сортировки, который использует собственные значения байтов.
Кен Моллеруп,

@KenMollerup, пожалуйста, добавьте больше информации к вашему ответу. Добавить цитату из man sort, добавить примеры.
crrp

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