Подтвердить что ты не робот

Сортировка не сортировка, как ожидалось (пробел и локаль)

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

v 1006
v10 1
v 1011

Я бы ожидал результата следующим образом:

v 1006
v 1011
v10 1

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

4b9b3361

Ответ 1

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

$ 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

Ответ 2

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

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

Но с C locale я получаю следующее:

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

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

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

Ответ 3

См. утилиты GNU FAQ