* コマンド女子 *

~自分の備忘録~

行の並び替えをしたい sort

▼コマンド

【sort】
 ・行を並び替えする
※デフォルトでは昇順にソートされる。

▼オプション
主なオプション(一部です)

  -t
   フィールドの区切り文字を指定するオプション
デフォルトはスペース。 例)-t ,でコンマ区切りになる
  -f
   大文字、小文字を区別しないでソートする
  -k
   どの列で並び替えるかを指定する
   例) -k 1,2 … 1列目で比較し、1列目が同じ場合は 2列目で比較する。
   例) -k 1 … 1列目で比較し、同じ場合は2列目で比較し、また同じであれば3列目で比較…というふうに最後の列まで順番に比較する。
  -n
   データを数値とみなしてソートする
  -r
   降順でソートする
  -c
   指定したファイルに対してソートされているかどうかチェックする


▼使用例
こんなファイルがあります

$ cat test.txt

ID,name,age
1,aaa,20
4,ddd,35
5,eee,20
2,bbb,34
3,ccc,40

// ID(第1フィールド)で並び替え
$ cat test.txt | sort -t, -k1
1,aaa,20
2,bbb,34
3,ccc,40
4,ddd,35
5,eee,20
ID,name,age


// 2列目で降順ソート
$ cat test.txt | sort -t, -r -k2,2
ID,name,age
5,eee,20
4,ddd,35
3,ccc,40
2,bbb,34
1,aaa,20


▼日付のソート 

// 年月日が混在する場合
$ cat day2.txt
2014/2/4,13
2013/12/6,20
2014/2/3,12
2015/1/1,4
2014/2/2,10
2015/8/1,25
2015/9/5,30
2015/4/5,3
2013/12/4,45
2013/11/30,30

// 日付でソート。(デリミタを/にする)
$ cat day2.txt | sort -n -t/ -k1
2013/11/30,30
2013/12/4,45
2013/12/6,20
2014/2/2,10
2014/2/3,12
2014/2/4,13
2015/1/1,4
2015/4/5,3
2015/8/1,25
2015/9/5,30

// デリミタを,にして第2フィールドでソート
$ cat day2.txt | sort -n -t, -k2
2015/4/5,3
2015/1/1,4
2014/2/2,10
2014/2/3,12
2014/2/4,13
2013/12/6,20
2015/8/1,25
2013/11/30,30
2015/9/5,30
2013/12/4,45

2つのファイルを比較する「comm(コム)」とか重複する行をまとめる「uniq」とか、まずソートする必要があるので、そんな時にsort使ってます。