私はUbuntu 18.04とデフォルトのcoreutilsを使用しています。私はこのコマンドの珍しい動作を見つけましたが、どのようにsort
説明するのかわかりません。
次のコマンドを検討してください。
$ cat <<EOF | sort
0-
01-
EOF
0-
01-
-
この出力はASCII値が予想より小さいため意味があり、1
したがってこの出力が予想されます。
ただし、最後にもう1つの文字を追加すると、次のようになります。
$ cat <<EOF | sort
0-T
01-T
EOF
01-T
0-T
0-T
この出力はそれが最初に出るべきだと思うので、私には意味がありません。なぜこれが起こるのですか?私がここで何を見逃しているのでしょうか?私の期待は間違っていますか?
ベストアンサー1
これは、地域の照合順序によって異なります。
照合順序は、アクセント記号付きの文字の順序を許可する各ロケールの規則セットです(たとえば、スペイン語では後ろに表示され、ñ
前n
に表示されますo
)。
しかし、そうではありません。照合規則によって、ソート時に無視される文字も指定されます。ロケール「C」の場合はすべての文字が考慮されますが、「en_US」の場合はダッシュ(U002D)は無視されます。他のほとんどのロケールはiso14651_t1_common定義を継承するためです(一部のディストリビューションでは/usr/share/i18n/locales/にあります)。
したがって、最初のファイルをソートしても問題は発生しません。ダッシュを無視すると単純な文字比較で終わるからです。
-- ignore dashes --> -- sort -->
0- 0 0
01- 01 01
「T」を追加すると状況が変わりました。なぜですか?ダッシュを無視すると、「1」と「T」(最初の文字は同じ)を比較する必要があり、「1」が「T」の前に来るためです。
-- ignore dashes --> -- sort -->
0-T 0T 01T
01-T 01T 0T
したがって、ソート時には常に「C」ルールを使用し、LC_COLLATE = Cを使用するのが最善です。
あなたの場合:
$ cat <<EOF | LC_COLLATE=C sort
0-T
01-T
EOF
生産する:
0-T
01-T
予想通り。