Я не знаю каких-либо локалей, которые по умолчанию сортируют в таком порядке. Решение заключается в создании пользовательского языкового стандарта с настраиваемым порядком сортировки. Если кто-то, спустя четыре года, хочет отсортировать по индивидуальному заказу, вот в чем фокус.
Подавляющее большинство локалей не задают свой собственный порядок сортировки, а скорее копируют определенный порядок сортировки, /usr/share/i18n/locales/iso14651_t1_common
так что это то, что вы захотите редактировать. Вместо того, чтобы изменять порядок сортировки почти каждой локали, изменяя оригинал iso14651_t1_common
, я предлагаю вам сделать копию. Подробная информация о том, как работает порядок сортировки и как создать пользовательский языковой стандарт в вашем $HOME
каталоге без корневого доступа, содержится в этом ответе на аналогичный вопрос .
Посмотрите, как a
и как A
они упорядочены на основе их записей в iso14651_t1_common
:
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
b
и B
похожи:
<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B
Мы видим, что на первом проходе оба a
и A
имеют символ сортировки <a>
, а оба b
и B
имеют символ сортировки <b>
. Так как <a>
появляется раньше <b>
в iso14651_t1_common
, a
и A
связаны до b
и B
. Второй проход не разрывает связи, потому что все четыре символа имеют символ сортировки <BAS>
, но во время третьего прохода связи разрешаются, потому что символ сортировки для строчных букв <MIN>
появляется в строке 3467, перед символом сортировки для прописных букв <CAP>
(строка 3488) , Таким образом, порядок сортировки заканчивается как a
, A
, b
, B
.
Поменяв местами первый и третий символы сортировки, можно отсортировать буквы сначала по регистру (ниже, чем по верху), затем по акценту ( <BAS>
означает без акцента ), а затем по алфавиту. Однако оба <MIN>
и <CAP>
идут перед цифровыми цифрами, так что это будет иметь нежелательный эффект, заключаясь в том, что цифры ставятся после букв.
Самый простой способ сохранить цифры вначале, когда все строчные буквы идут раньше всех заглавных букв, состоит в том, чтобы принудительно связать все буквы во время первого сравнения, установив их все равными <a>
. Чтобы убедиться, что они сортируются в алфавитном порядке в пределах регистра, измените последний символ сортировки с IGNORE
текущего первого символа сортировки. Следуя этой схеме, a
станет:
<U0061> <a>;<BAS>;<MIN>;<a> # 198 a
A
станет:
<U0041> <a>;<BAS>;<CAP>;<a> # 517 A
b
станет:
<U0062> <a>;<BAS>;<MIN>;<b> # 233 b
B
станет:
<U0042> <a>;<BAS>;<CAP>;<b> # 550 B
и так далее для остальных букв.
После того, как вы создали настроенную версию iso14651_t1_common
, следуйте инструкциям в ответе, указанном выше, чтобы скомпилировать свой собственный языковой стандарт.
sort
, но с точкой с запятой переменная является локальной для оболочки и не влияет на поведениеsort
. Точка с запятой может быть сохранена как есть, если переменная также экспортируется, но это повлияет и на другие команды.