ソートコマンドの一貫性のない動作

ソートコマンドの一貫性のない動作

両方のファイルをソートしたいが、一貫した結果を得ることはできません。照合に問題があるようですが、理由がわかりません。サンプルファイルでは、区切り文字は空白です。

ファイル1:

a
b
B
A

ファイル2:

a 1
b 0
B 1
A 0

私はこれらのファイルを並べ替えましたが、sort -k1,1結果は次のようになります。

ソート1:

a
A
b
B

ソート2:

A 0
a 1
b 0
B 1

ソートするには、そのファイルが必要であり、join現在のファイルのいずれかがソートされていないと文句を言います。

環境には設定されておらず、LC_COLLATE次に設定されていますLC_ALLLANGen_US.UTF-8

出力はLC_ALL=C sort -k1,1次のとおりです

ソート11:

A
B
a
b

ソート22:

A 0
B 1
a 1
b 0

特定の順序は必要なく、結果をマージするだけです。このアプローチはjoin効果的です。安全のためにjoin前に追加することもできますLC_ALL=C

私の質問

sorted1 aあなたはなぜ今後 Aそしてsorted2 a後ろに A?照合順序が何であれ、両方のコマンドに対して機能し、両方のsort入力ファイルで同じ列1に基づいてソートしています。

追加された出力ltrace -e strcoll

ファイル1

sort->strcoll("B","A") =1
sort->strcoll("a","b") =-1 
sort->strcoll("a","A") =-7
a
sort->strcoll("b","A") =1
A
sort->strcoll("b","B") =-7
b
B
+++ exited (status 0) +++

ファイル2

sort->strcoll("B 1","A 0") =1
sort->strcoll("a 1","b 0") =-1 
sort->strcoll("a 1","A 0") =1
A 0
sort->strcoll("a 1","B 1) =-1
a 1
sort->strcoll("b 0","B 1") =-1
b 0
B 1
+++ exited (status 0) +++

答え1

Stéphane Chazelasが書いたようにコメントこれはCentOS / Red Hatの特定の実装のバグであり、より具体的にはcoreutilsGNUの上に作成して適用したcoreutils-8.22-11.el7欠陥のある国際化パッチ()です。coreutils-i18n.patchcoreutils-8.22

報告しました。ここCentOSとここレッドハットに。すでにみんな知ってるRed Hatとcoreutils-8.22-13.el7

この製品はまだ利用できません中央オペレーティングシステムこの時(2015-08-20)。

完璧さのために、このバグも存在することに注意してください(間違ったバグではありません)。アップストリームレポートこれに関する詳細情報は(GNUで)見つけることができます。

答え2

この問題は既定の照合順序(en_US.UTF-8)が原因で発生します。あなたは設定する必要がありますLC_COLLATE示されているようにテキストを並べ替える値。

 LC_COLLATE='C' sort -k1 file1

関連情報