Каков порядок по умолчанию для сортировки Linux?

18

Долгое время я думал, что стандартное поведение sortпрограммы использует порядок ASCII. Однако, когда я ввожу следующие строки sortбез каких-либо аргументов:

#
@

Я получил:

@
#

Но согласно таблице ASCII, #это 35 и @64. Другой пример:

A
a

И вывод:

a
A

Кто-нибудь может объяснить это? Кстати, что такое «словарь-порядок» при использовании sort -d?

G-Man говорит: «Восстанови Монику»
источник
5
Порядок сортировки зависит от настроек локали
janneb
2
Но это по умолчанию в алфавитном порядке, по крайней мере, в сортировке GNU.
Ярно

Ответы:

17

Похоже, вы используете не POSIX локаль.

Пытаться:

export LC_ALL=C

а потом sort.

info sort ясно говорит:

(1) Если вы используете не POSIX локаль (например, установив `LC_ALL 'в` en_US'), то `sort 'может произвести вывод, который отсортирован иначе, чем вы привыкли. В этом случае установите переменную окружения LC_ALL на C. Обратите внимание, что установка только `LC_COLLATE 'имеет две проблемы. Во-первых, это неэффективно, если `LC_ALL 'также установлен. Во-вторых, он имеет неопределенное поведение, если для `LC_CTYPE '(или` LANG', если `LC_CTYPE 'не установлено) установлено несовместимое значение. Например, вы получаете неопределенное поведение, если LC_CTYPE равен ja_JP.PCK, а LC_COLLATE равен en_US.UTF-8.

codaddict
источник
3
ОП спрашивает, что такое порядок сортировки, а не как его изменить.
1
Спасибо, я проверил на своей машине, и настройки локали влияют на поведение сортировки
3

Чтобы определить порядок сортировки, просто создайте файл с различным символом в каждой строке и выполните сортировку. В результате вы получите порядок сортировки.

Гейб
источник
Хороший, простой и эффективный
1
Вообще очень хорошая идея, но этого не всегда достаточно. Сортировка не должна быть определена только для отдельных символов. Некоторые сопоставления обрабатывают «ae», как если бы это была лигатура, или обрабатывают лигатуры, как если бы они были разложены. Другой случай - многие параметры сортировки обрабатывают 'a' и 'A' как равные, но порядок, который вы видите при тестировании, не говорит об этом (он может сказать, стабильна ли сортировка). А односимвольный тест не показывает, действуют ли расширение табуляции, нормализация пробелов и т. Д. Тем не менее, это очень хорошее место для начала.
TextGeek
1
(слишком поздно, чтобы отредактировать предыдущий комментарий) - если вы на самом деле включаете достаточно разнообразный диапазон символов, вы можете сказать игнорированию регистра не видеть (например) aAbB вместо abAB.
TextGeek
2

Как man sortговорится, «словарь-порядок» означает «учитывать только пробелы и буквенно-цифровые символы». Например, учитывая данные

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

неукрашенная sortкоманда производит

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(ввод строки , которые начинаются с символами пробела и !, #, $, %и @символами 1 впереди строк , которые начинаются с буквами и цифрами, то есть буквенно - цифровые символы ), но sort -dпроизводит

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsвсе еще первый, потому что он начинается с пробелов, но специальные (знаки пунктуации) игнорируются.  17предшествует 42и foxвстает между brownи jumps, несмотря на то, что 42и foxесть символы перед ними, которые обычно перемещают их перед 17.
____________
1 в порядке их значений ASCII: пробел = 040, != 041, #= 043, $= 044, %= 045 и @= 0100. Обратите внимание, что (без учета пробела) это примерно слева направо на некоторых клавиатурах.

G-Man говорит: «Восстанови Монику»
источник
1
Порядок в вашем первом примере, где текст сортируется первым по пунктуации, может иметь место, если в качестве локали используется C (как с LC_ALL = C), но не в других локалях. Выбор локали по умолчанию зависит от настроек ОС. Итак, неукрашенные sort должны отличаться во многих Распределениях.
Исаак