はじめに
sortコマンドでただ適当に使うとうまくソートしてくれないことも多いですよね。紹介する内容だけ覚えておけば大抵の場合は対応できます。カラム指定や複数キー指定する方法を知っていれば余裕で現場で使えるはずです。
sortコマンドとは
ファイルやコマンドの標準出力の文字列をソートすることができるLinux等で使えるコマンドです。
基本構文
・書式
$ sort -t '区切り文字' -k ソートするカラム指定 対象ファイル
・例(/etc/paswdファイルに対し、区切り文字 : で3番目のカラムを数値として並べ替える。)
$ sort -t ':' -k 3,3n /etc/passwd
解説
-t オプション
-t ‘区切り文字’ で対象ファイルのフィールドを分ける区切り文字を指定します。
例えば、カンマ区切りのCSVファイルが対象ならば -t ‘,’ とします。
-k オプション
-k ソートするカラム指定 で並べ替えを行う対象のカラムと並べ替え方を指定します。
ソートするカラム指定が重要になります。以下で解説します。
ソートするカラム指定と並べ替え方のオプション
ソートするカラム指定
n番目のカラムでソートしたいなら、-k n,n とします。
例えば、3番目のカラムでソートするなら、-k 3,3 です。
並べ替え方のオプション
上記のカラム指定にくっつける形で並べ替えのオプションを設定できます。覚えるべきは以下の二つのみです。
n | 数値としてソートする |
r | 逆順でソートする |
n で数値として並べ替えを行います。3番目のカラムを数値として並べ替えるなら、-k 3,3n です。
r で逆順に並べ替えできます。3番目のカラムを逆順に並べ替えるなら、-k 3,3r です。
-k 3,3rn のように両方合わせることもできます。
複数のキーでのソート
-k オプションを以下のように複数回使うことで複数のキーでのソートもできます。
$ sort -t ',' -k 1,1n -k 3,3r test1.csv
例えば以下のような中身のtest1.csvというファイルがあるとします。
id,date,str
100,2020-10-30,AAA
50,2023-12-20,CCC
50,2020-10-20,AAA
50,2015-04-20,DDD
30,2019-10-19,BBB
999,2014-10-30,DDD
上記のsortコマンドを実行すると、idカラムが数値順でソートされ、その中で複数あるid =50の行で、strカラムが文字として逆順でソートされます。
id,date,str
30,2019-10-19,BBB
50,2015-04-20,DDD
50,2023-12-20,CCC
50,2020-10-20,AAA
100,2020-10-30,AAA
999,2014-10-30,DDD
実用例
並び順がぐちゃぐちゃなファイルがあってそれらの比較をしたいという場合は、sortした結果をdiffでコマンド実行結果を直接比較する方法を使うと便利です。
$ diff -s test1.csv test2.csv
1d0
< id,date,str
3,5d1
< 50,2023-12-20,CCC
< 50,2020-10-20,AAA
< 50,2015-04-20,DDD
6a3
> 50,2023-12-20,CCC
7a5,7
> id,date,str
> 50,2015-04-20,DDD
> 50,2020-10-20,AAA
$ diff -s <(sort -t ',' -k 1,1n test1.csv) <(sort -t ',' -k 1,1n test2.csv)
Files /dev/fd/63 and /dev/fd/62 are identical
Linuxをもっと使えるようになるには
実践あるのみ!ですが、一度体系的にLinuxを学習するとより深く理解することができますし、いろいろなコマンドを知っていると応用が効くようになります。
以下の書籍がおすすめです。
コメント