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

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
user2909884
источник
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будут игнорироваться все не буквенно-цифровые символы.

c0rp
источник
Извините, не видел этого, я отреагировал на комментарий!
Кен Моллеруп,
@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 ниже.
Кен Моллеруп,