デフォルトでその順序でソートされるロケールは知りません。解決策は、カスタマイズされた並べ替え順序でカスタム ロケールを作成することです。 4 年後、誰かが独自の方法で並べ替えたいと思った場合、ここに秘訣があります。
大多数のロケールでは、独自のソート順を指定していませんが、/usr/share/i18n/locales/iso14651_t1_common
で定義されているソート順をコピーしています。 それがあなたが編集したいものです。元の iso14651_t1_common
を変更して、ほぼすべてのロケールのソート順を変更するのではなく、 、コピーを作成することをお勧めします。ソート順の仕組みと $HOME
でカスタム ロケールを作成する方法の詳細 root アクセス権のないディレクトリは、同様の質問に対するこの回答にあります。
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
. 4 つの文字すべてに照合記号 <BAS>
があるため、2 番目のパスは引き分けにはなりません。 、しかし 3 番目のパスでは、小文字の照合記号が <MIN>
であるため、同点は解決されます。 3467 行目、大文字の照合記号 <CAP>
の前に表示されます (3488行目)。したがって、ソート順は a
になります。 、 A
、 b
、 B
.
1 番目と 3 番目の照合記号を交換すると、文字は最初に大文字と小文字 (小文字の次に大文字) で並べ替えられ、次にアクセント (<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
のカスタマイズ バージョンを作成したら、 、上記のリンク先の回答の指示に従って、カスタム ロケールをコンパイルしてください。
設定 LC_COLLATE=C
小文字の前に大文字をソートするには必ずしも十分ではありません。 LC_ALL=C
を設定する必要がある場合があります .
英数字以外の文字や印刷できない文字も考慮されますが、それを望まない場合は -d
オプションがあります と -i
(man sort
に記載 ) はそれをオフにします。
ただし、ASCII 以外の文字を含む UTF-8 などのマルチバイト入力では、おそらくひどく失敗します。
大文字 (順序) の前に小文字 (順序) を取得するには、本格的なプログラミング言語を分解することを含まない、私が考えることができる最善の方法は、並べ替えの前にすべての文字の大文字と小文字を反転し、それらを元に戻すことです。
tr 'a-zA-Z' 'A-Za-z' < file | LC_ALL=C sort | tr 'a-zA-Z' 'A-Za-z'
私は専門家ではありませんが、このような照合を定義するロケールを見たことがありません。私の知る限り、この照合は、ASCII 値に基づいている C でのみ行われます。 (通常、これはスクリプトで解決します。)
ただし、私はこれを行ったことはありませんが、localedef(1) および locale(5) のマンページを見て、ロケールがどのように定義されているかを理解し、最終的に独自のロケールを定義することをお勧めします。
また、分音符号や特殊文字がある場合、C ロケールはそれらを希望どおりに処理しないことも忘れないでください。たとえば、á
は入れません。 a
付近 または Ł
L
付近 .そのような場合、言語のネイティブ ロケールがおそらく出発点として適しています。