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

Я попытался отсортировать содержимое файла на рабочем столе 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

2 ответа

Решение

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

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

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

Другие вопросы по тегам