この例では、列グループでソートし、他の列を無視することは失敗します。なぜですか?

この例では、列グループでソートし、他の列を無視することは失敗します。なぜですか?

なぜ動作しないのかはわかりませんが、しないようにsort列を基準に並べています。優先順位に従って3列を最初に並べ替えてから、4列、5列、6列を基準に並べ替えたいと思います。どうなりますか?

これは私のコードです。sort -n -s -t ',' -k3,6

これは私の入力です。

a1,b1,2,15,50,ABBA    
a1,a1,2,26,55,ABBA    
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c3,4,1700,2050,ART   
d3,c2c,4,1600,2050,ART   
b1,a3,4,1800,2051,ART   

これは私の現在の出力です。

a1,b1,2,15,50,ABBA   
a1,a1,2,26,55,ABBA   
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c3,4,1700,2050,ART 
d3,c2c,4,1600,2050,ART
b1,a3,4,1800,2051,ART   

しかし、私が望んで予想される結果は次のようになります。

a1,b1,2,15,50,ABBA   
a1,a1,2,26,55,ABBA   
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c2c,4,1600,2050,ART    
d3,c3,4,1700,2050,ART
b1,a3,4,1800,2051,ART 

私はLinuxを使用しています。

ベストアンサー1

問題は、ソートキーがコンマを含む文字列であることです。

4,1700,2050,ARTとのような2つのキーを比較する4,1600,2050,ARTとき同じ(ロケールでは)キーの最初の部分だけが数値(4と4)に変換できるためです。

この問題を解決するには、各フィールドを正しいフィールドタイプ(数値または非数字)と個別に比較します。

sort -s -t, -k3,3n -k4,4n -k5,5n -k6,6 file

ほとんどの実装は、これらの問題を検出するのに非常に役立つオプションをsort提供します。--debug私のFreeBSDシステムでは、これは元のコマンドで私が言及したフィールドを比較するのに問題があることを明らかに示しています。

$ sort --debug -n -s -t ',' -k3,6 file
[...]
; k1=<4,1000,2000,ART   >, k2=<4,1700,2050,ART   >; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c3,4,1700,2050,ART   >; cmp1=0
; k1=<4,1700,2050,ART   >, k2=<4,1600,2050,ART   >; s1=<d3,c3,4,1700,2050,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=0
; k1=<4,1600,2050,ART   >, k2=<4,1800,2051,ART   >; s1=<d3,c2c,4,1600,2050,ART   >, s2=<b1,a3,4,1800,2051,ART   >; cmp1=0
[...]

cmp1=0キーk1k2比較が同じであることを示します。

比較しよう:

$ sort --debug -s -t, -k3,3n -k4,4n -k5,5n -k6,6 file
[...]
; k1=<4>, k2=<4>; k1=<1000>, k2=<1700>; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c3,4,1700,2050,ART   >; cmp1=-1
; k1=<4>, k2=<4>; k1=<1700>, k2=<1600>; s1=<d3,c3,4,1700,2050,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=1
; k1=<4>, k2=<4>; k1=<1000>, k2=<1600>; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=-1
; k1=<4>, k2=<4>; k1=<1700>, k2=<1800>; s1=<d3,c3,4,1700,2050,ART   >, s2=<b1,a3,4,1800,2051,ART   >; cmp1=-1
[...]

GNUはsortまったく異なる形式でデバッグ出力を生成できます。

おすすめ記事