GNU/Linux >> Linux の 問題 >  >> Linux

小文字が大文字の前になるように、LC_COLLATE でソート順を指定します。

デフォルトでその順序でソートされるロケールは知りません。解決策は、カスタマイズされた並べ替え順序でカスタム ロケールを作成することです。 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

bB 似ています:

<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b
<U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B

最初のパスでは、両方とも a であることがわかります と A 照合記号 <a> を持つ 、同時に bB 照合記号 <b> を持つ . <a>以降 <b> の前に表示されます iso14651_t1_common で 、 aA b の前に並んでいます と B . 4 つの文字すべてに照合記号 <BAS> があるため、2 番目のパスは引き分けにはなりません。 、しかし 3 番目のパスでは、小文字の照合記号が <MIN> であるため、同点は解決されます。 3467 行目、大文字の照合記号 <CAP> の前に表示されます (3488行目)。したがって、ソート順は a になります。 、 AbB .

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付近 .そのような場合、言語のネイティブ ロケールがおそらく出発点として適しています。


Linux
  1. Linuxカーネルをftraceで分析する

  2. コマンドラインでsortを使用してソートする

  3. Linuxでの並べ替えコマンドと例

  1. レンジャーで特定のフォルダ内のファイルを並べ替えますか?

  2. Duコマンドで–excludeを使用しますか?

  3. Unix ソートで複数のキーをソートする

  1. Bash の「test」コマンドでの「&&」と「&」の比較

  2. スクリーンショットを作成する前に Puppeteer で DOM の要素を変更することはできますか?

  3. Linux ソートのデフォルトの順序は何ですか?