やりたいこと
以下のようなファイルを
3,1,one 4,1,two 5,9,three 2,6,four 5,3,five 5,8,six 9,7,seven 9,3,eight 2,3,nine 8,4,ten
以下のように並べ替えたい。
2,6,four 2,3,nine 3,1,one 4,1,two 5,9,three 5,8,six 5,3,five 8,4,ten 9,7,seven 9,3,eight
要は一列目は降順で二列目は昇順。
コマンド実行環境
$ sort --version sort (GNU coreutils) 8.26
やり方
$ sort -t',' -k1,1n -rk2,2n hoge.csv
以下、解説です。
解説
ファイルに対してそのままsortコマンドを実行すると以下のように2列目も降順となります。
$ sort -n hoge.csv 2,3,nine 2,6,four 3,1,one 4,1,two 5,3,five 5,8,six 5,9,three 8,4,ten 9,3,eight 9,7,seven
これは逆にしても然り。
$ sort -rn hoge.csv 9,7,seven 9,3,eight 8,4,ten 5,9,three 5,8,six 5,3,five 4,1,two 3,1,one 2,6,four 2,3,nine
よって明示的に特定列は降順で特定列は降順と指定する必要があります。
そのやり方は、-t
オプションで区切り文字を指定し、並べかえを行うフィールドを-k
オプションで指定する手法です。
これにより、以下のように欲しい並べ替え結果になります。
$ sort -t',' -k1,1n -rk2,2n hoge.csv 2,6,four 2,3,nine 3,1,one 4,1,two 5,9,three 5,8,six 5,3,five 8,4,ten 9,7,seven 9,3,eight
以上、ご参考になれば幸いです。