大文字と小文字を区別するGNUソート


35

sortUbuntu 10.04(Lucid)のユーティリティは、指定--ignore-caseした場合と同様に、常に大文字と小文字を区別しないでソートします。

The two sort just give the same result: 

echo -e "c\nb\nB\na" | sort
echo -e "c\nb\nB\na" | sort --ignore-case

ただし、大文字と小文字を区別して並べ替えたい場合があるので、大文字が最初に来てから小文字が来るようにします。出来ますか?

回答:


31

照合順序をオーバーライドします。

echo -e "c\nb\nB\na" | LC_COLLATE=C sort

5
これは機能しますが、定義上、外部文字がない場合のみです。プレイ中です。7ビットASCII文字のにソートさます。試してくださいecho $'B\nÄ\nb\na' | LC_COLLATE=C sort。ロケールsortを持たないGNU が常に大文字と小文字を区別しないソートを実行するという事実をバグと見なすべきではありませんか?C
mklement0

「外来文字」に関して、C.UTF-8ロケール(LC_COLLATE=C.UTF-8)は大文字と小文字を区別してソートしますが、非ASCII UTF-8文字を「通常」処理します。残念ながら、glibcのアップストリームでは利用できず、Debian、Ubuntu、および派生物によってのみパッチが適用されます。
9:54に

13

興味深いことに、さらに次のようなソート順が利用可能です。

echo -e "c\nb\nB\na" | LC_COLLATE=C sort --ignore-case

これは、対応する小文字の前に大文字を置きます。

en_US.UTF-8ロケールでの出力の比較(「d」と「D」を追加しました)(オーバーライドされている場合を除く):

  1. echo -e "d\nD\nc\nb\nB\na" | sort
  2. echo -e "d\nD\nc\nb\nB\na" | sort --ignore-case
  3. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort
  4. echo -e "d\nD\nc\nb\nB\na" | LC_COLLATE=C sort --ignore-case

出力:

1   2   3   4
-   -   -   -
a   a   B   a
b   b   D   B
B   B   a   b
c   c   b   c
d   d   c   D
D   D   d   d

面白い; この動作はGNU sort v5.93(OS X 10.9.3(!)に付属)およびv8.13で見られますが、v8.21とではありませんv8.22。2.と4.の結果はまだ同等であると考えることができます(ただし、外部文字を追加すると明らかに変化します)。
mklement0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.