сортировка не сортировка как ожидалось (пробел и локаль) - PullRequest
12 голосов
/ 06 мая 2011

Я хочу отсортировать текстовый файл через linux sort, который выглядит следующим образом

v 1006
v10 1
v 1011

Я ожидаю, что результат будет таким:

v 1006
v 1011
v10 1

Однако, используя sort, даже со всеми видами опций, строка v10 1 все еще находится в середине.Зачем?Я бы понял, что v10 1 находится либо сверху внизу (в зависимости от того, является ли символ пробела меньше или больше 1), но по какой причине он находится в середине?

Ответы [ 2 ]

16 голосов
/ 06 мая 2011

Для определения порядка сортировки букв используется системный языковой стандарт. Я предполагаю, что в вашей локали он игнорирует пробелы.

$ cat foo.txt 
v 1006
v10 1
v 1011
$ LC_ALL=C sort foo.txt
v 1006
v 1011
v10 1
$ LC_ALL=en_US.utf8 sort foo.txt
v 1006
v10 1
v 1011
4 голосов
/ 06 мая 2011

Ваш языковой стандарт влияет на сортировку строк.Например, я получаю это с моим текущим языковым стандартом:

% echo -e "v 1006\nv10 1\nv 1011" | sort
v 1006
v10 1
v 1011

Но с языковым стандартом C я получаю это:

% echo -e "v 1006\nv10 1\nv 1011" | LC_ALL=C sort
v 1006
v 1011
v10 1

Я не уверен, почему он действительно так себя ведет.LC_ALL=C в значительной степени эквивалентно отключению всей непредвиденной обработки и возвращению к операциям на уровне байтов (да - я пропускаю детали).

Почему другие настройки локали пропускают пространство, объяснить труднеехоть.Если кто-нибудь может объяснить это было бы хорошо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...