Сортировка не сортировка, как ожидалось (пробел и локаль)
Я хочу отсортировать текстовый файл через linux sort
, который выглядит следующим образом
v 1006
v10 1
v 1011
Я бы ожидал результата следующим образом:
v 1006
v 1011
v10 1
Однако, используя sort
, даже при всех вариантах, строка v10 1
все еще находится посередине. Зачем? Я бы понял, что v10 1
находится либо сверху сверху (в зависимости от того, является ли размер пробела меньше или больше, чем 1
), но по какой причине он поддерживается посередине?
Ответы
Ответ 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