
なぜ:
$ echo -e 'Q\ns\nV' | sort
出力
Q
s
V
私のリストの順序を変更せずに(小文字/大文字を考慮しますか?)
答え1
ほとんどの言語では、s
大文字と小文字に関係なく、すべてが最初にソートされます。V
ソートは、ローカライズ設定(LANG
およびLC_*
変数)によって異なります。
LC_ALL=C sort
バイト値の順序に基づいてソートするには、次を使用できます。ただし、マルチバイトロケールにある場合は、要件を満たしていない可能性があります。
言語順に並べ替えたいのですが、大文字が小文字より前の場合は、次のようにできます。
sed 's/./0&/g;s/0\([[:lower:]]\)/1\1/g' |
sort |
sed 's/.\(.\)/\1/g'
これにより、小文字が他のすべての文字の後にソートされます。
$ print -l Q s d é f D É F V | sort
d
D
é
É
f
F
Q
s
V
$ print -l Q s d é f D É F V | sed 's/./0&/g;s/0\([[:lower:]]\)/1\1/g' |
sort |
sed 's/.\(.\)/\1/g'
D
É
F
Q
V
d
é
f
s
これは、組み合わせ要素が単一文字のロケールにのみ適用されます。
答え2
sort
ソート順序は、環境のロケールによって異なります。sort
マンページから。
*** WARNING *** The locale specified by the environment affects sort order.
Set LC_ALL=C to get the traditional sort order that uses native byte values.
POSIXまたはCロケールのため、期待sort
どおりに動作します。
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='' sort --ignore-case
Q
s
V
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort
Q
V
s
reedm@www:~ $ echo -e 'Q\ns\nV' | LC_ALL='c' sort --ignore-case
Q
s
V