
与えられたファイル:
$ cat file
1
a
C
B
2
c
3
A
b
基本的にはsort
次のようになります。
$ sort file
1
2
3
a
A
b
B
c
C
これにより、LC_COLLATE=C
大文字が小文字の前にソートされます。
$ LC_COLLATE=C sort file
1
2
3
A
B
C
a
b
c
大文字と小文字の逆順(たとえば、数字、小文字、大文字の順)で並べ替えることはできますか?
答え1
デフォルトでは、その順序でソートされるロケールはわかりません。解決策は、カスタムソート順序を使用してカスタムロケールを作成することです。 4年後の誰かがカスタマイズされた方法で整理したい場合は、ここにコツがあります。
ほとんどのロケールは、独自のソート順序を指定せずに、代わりに/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
持ち、両方とも組み合わせ記号を持っていることがわかります。以前に表示され、以前と並置されるためです。 2番目のパスでは、4文字すべてが組み合わせ記号を持っているため、同点は壊れませんが、3番目のパスでは、小文字の組み合わせ記号が大文字の組み合わせ記号(行3467)の前の行3467に表示されるため、動点は解決されます。 ).3488ライン)。したがって、ソート順序は、、、となります。A
<a>
b
B
<b>
<a>
<b>
iso14651_t1_common
a
A
b
B
<BAS>
<MIN>
<CAP>
a
A
b
B
最初と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
次のガイドラインに従ってください。上記の回答カスタムロケールをコンパイルします。
答え2
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'
答え3
私は専門家ではありませんが、このようなロケール定義の照合順序を見たことはありません。 AFAIKこの照合順序はCベースでのみ機能します。ASCII値。 (通常、この問題はスクリプトによって解決されます。)
しかし、私はこれをやったことがありません。しかし、一度見てみたいかもしれません。地域定義(1)そしてロケール(5)ロケールを定義し、最終的に独自のロケールを定義する方法については、マンページを参照してください。
また、発音区別記号や特殊文字がある場合は、Cロケールはそれを望む方法で処理しないことを忘れないでください。たとえば、á
「near」a
またはŁ
「near」は配置されませんL
。この場合、言語のロケールがより良い出発点になる可能性があります。
答え4
LC_COLLATE="en_US.UTF-8" sort file