両方のファイルをソートしたいが、一貫した結果を得ることはできません。照合に問題があるようですが、理由がわかりません。サンプルファイルでは、区切り文字は空白です。
ファイル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_ALL
。LANG
en_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の特定の実装のバグであり、より具体的にはcoreutils
GNUの上に作成して適用したcoreutils-8.22-11.el7
欠陥のある国際化パッチ()です。coreutils-i18n.patch
coreutils-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