忘れないようにメモっとく

機械学習とかプログラミングとか。

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

ソートは時間かかるので、でかいデータ使うときは必要最低限な形まで削ってから実行すべし。(まあソートに限らず)