joinコマンド ~複数フィールドで結合する。
Unixコマンドのjoinが便利。2つのファイルでフィールドを指定すれば、SQLの内部結合みたいなことができる。
SQLだとテーブル作ってデータ流し込むのが面倒だし、構造が複雑じゃないデータなら、サクッと実行できてよいよい。
joinで指定できるのは各ファイルに1つのフィールドなので、複数フィールドで結合するときには、ちょっと工夫する。
例えば、次のようなファイルで
file1.txt
1 3 a 2 1 b 5 3 c 2 3 d 4 1 e
file2.txt
1 2 2 3 4 5 4 1 1 3
awkとsortで、結合前の中間ファイルを作ってからjoinで結合する。
シェルスクリプトを書くと、
gist7350006
ここで作ったsort1とsort2は
sort1
1:3 1 3 a 2:1 2 1 b 2:3 2 3 d 4:1 4 1 e 5:3 5 3 c
sort2
1:2 1:3 2:3 4:1 4:5
という形。1列目でソートされているので、joinが使える。
今回はコロンで2つのフィールドを繋いだけど、正しくソートできればなんでもおk。
最終的な出力は
1,3,a 2,3,d 4,1,e
ソートは時間かかるので、でかいデータ使うときは必要最低限な形まで削ってから実行すべし。(まあソートに限らず)