なぜ動作しないのかはわかりませんが、しないように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
キーk1
とk2
比較が同じであることを示します。
比較しよう:
$ 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
まったく異なる形式でデバッグ出力を生成できます。
答え2
問題は、数字ではなく語彙でソートすることです。-n
数字でソートする必要があります。それ以外の場合は、次の前にソートされ100
ます。123
2
$ printf '2\n123\n100\n' | sort
100
123
2
ただし、次のようになります-n
。
$ printf '2\n123\n100\n' | sort -n
2
100
123
n
したがって、あなたの場合は、数字で並べ替えたいフィールドに以下を追加する必要があります。
$ sort -t, -k3n,6n file
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