(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux/sortコマンド】一列目は降順で二列目は昇順にする

スポンサーリンク

やりたいこと

以下のようなファイルを

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

以上、ご参考になれば幸いです。