Nevím o žádných lokalitách, které by ve výchozím nastavení seřadily v tomto pořadí. Řešením je vytvořit vlastní národní prostředí s přizpůsobeným pořadím řazení. Pokud někdo o čtyři roky později chce třídit na zakázku, tady je trik.
Naprostá většina národních prostředí neurčuje své vlastní pořadí řazení, ale spíše kopíruje pořadí řazení definované v /usr/share/i18n/locales/iso14651_t1_common
tak to je to, co budete chtít upravit. Raději než změnit pořadí řazení pro téměř každé národní prostředí úpravou původního iso14651_t1_common
, doporučuji vytvořit kopii. Podrobnosti o tom, jak funguje pořadí řazení a jak vytvořit vlastní národní prostředí v $HOME
adresář bez přístupu root najdete v této odpovědi na podobnou otázku.
Podívejte se, jak a
a A
jsou seřazeny na základě jejich položek v iso14651_t1_common
:
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a
<U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
b
a B
jsou podobné:
<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B
Vidíme, že při prvním průchodu obě a
a A
mají symbol řazení <a>
, zatímco obě b
a B
mají symbol řazení <b>
. Od <a>
se objeví před <b>
v iso14651_t1_common
, a
a A
jsou shodné před b
a B
. Druhý průchod nezlomí vazby, protože všechny čtyři znaky mají symbol řazení <BAS>
, ale během třetího průchodu jsou remízy vyřešeny, protože symbol řazení pro malá písmena <MIN>
se objeví na řádku 3467 před symbolem řazení pro velká písmena <CAP>
(řádek 3488). Pořadí řazení tedy skončí jako a
, A
, b
, B
.
Při záměně prvního a třetího symbolu řazení by se písmena seřadila nejprve podle velkých a malých písmen (dolní, pak horní) a poté podle diakritiky (<BAS>
znamená bez přízvuku), pak v abecedním pořadí. Nicméně , oba <MIN>
a <CAP>
přicházet před číselné číslice, takže by to mělo nežádoucí účinek vkládání číslic za písmena.
Nejjednodušší způsob, jak při vytváření všech ponechat nejprve číslice malá písmena jsou před všem velká písmena znamená, že při prvním porovnávání se všechna písmena shodí tak, že se všechna nastaví na hodnotu <a>
. Chcete-li zajistit, aby se třídily abecedně s velkými a malými písmeny, změňte poslední symbol řazení z IGNORE
na aktuální první symbol řazení. Podle tohoto vzoru a
by se stalo:
<U0061> <a>;<BAS>;<MIN>;<a> # 198 a
A
by se stalo:
<U0041> <a>;<BAS>;<CAP>;<a> # 517 A
b
by se stalo:
<U0062> <a>;<BAS>;<MIN>;<b> # 233 b
B
by se stalo:
<U0042> <a>;<BAS>;<CAP>;<b> # 550 B
a tak dále pro zbývající písmena.
Jakmile vytvoříte přizpůsobenou verzi iso14651_t1_common
, postupujte podle pokynů ve výše uvedené odpovědi a zkompilujte své vlastní národní prostředí.
Nastavení LC_COLLATE=C
není vždy dostačující k řazení velkých písmen před malými. Možná budete muset nastavit LC_ALL=C
.
To také vezme v úvahu nealfanumerické a dokonce netisknutelné znaky, ale pokud nechcete, existují možnosti -d
a -i
(popsáno v man sort
) to vypne.
Pravděpodobně však selže s vícebajtovým vstupem, jako je UTF-8 s jinými znaky než ASCII.
Chcete-li dostat malá (v pořadí) před velká (v pořadí), nejlepší způsob, který mě napadá, nezahrnuje rozbití plnohodnotného programovacího jazyka, je invertování velkých a malých písmen všech písmen před řazením a jejich obrácení zpět. poté.
tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'
Nejsem odborník, ale nikdy jsem neviděl národní prostředí, které by takto definovalo řazení. AFAIK toto řazení je pouze v C, kde je založeno na hodnotách ASCII. (Normálně bych to vyřešil skriptem.)
Nikdy jsem to však nedělal, ale možná se budete chtít podívat na manuálové stránky localedef(1) a locale(5), abyste pochopili, jak jsou definována národní prostředí, a případně si definujte své vlastní.
Nezapomeňte také, že pokud jsou tam nějaké diakritické nebo speciální znaky, C locale s nimi nebude zacházet tak, jak byste chtěli. Například nevloží á
blízko a
nebo Ł
blízko L
. V takových případech by nativní národní prostředí jazyka bylo pravděpodobně lepším výchozím bodem.