特定の列をキーにして、複数のファイルを行単位でJOINする。SQLのJOINみたいな。
キーに関係なく、単に行同士を結合するにはpaste
コマンドを使う。
2つのタブ区切りのファイルをjoinする例
$ cat a.txt1 Danny 292 Jess 243 Joey 294 D.J. 105 Steph 56 Michelle 0$ cat b.txt1 m2 m3 m4 f5 f6 f$ join -1 1 -2 1 a.txt b.txt1 Danny 29 m2 Jess 24 m3 Joey 29 m4 D.J. 10 f5 Steph 5 f6 Michelle 0 f
-1 1
は1つ目のファイルは1つ目のフィールドをキーにするという意味。-2 1
は2つ目のファイルは1つ目のフィールドをキーにするという意味。
入力はタブ区切りでなくてもスペース区切りでもいい。区切り文字が複数連続していても1つの区切りとみなされるので、スペースで横位置を揃えてある固定長フィールドのファイルも意図通りの動作になる。
出力は単一のスペース区切りになる。
固定長フィールドのファイル処理の例
$ cat test1.txtDanny 29 0Jess 24 1Joey 29 2D.J. 10 3Steph 5 4Michelle 0 5$ cat test2.txt0 m1 m2 m3 f4 f5 f$ join -1 3 -2 1 test{1,2}.txt0 Danny 29 m1 Jess 24 m2 Joey 29 m3 D.J. 10 f4 Steph 5 f5 Michelle 0 f
-1 3 -2 1
は1つ目のファイルは3つ目のフィールドをキーにし、2つ目のファイルは1つ目のフィールドをキーにする、という意味。
test{1,2}.txt
という書き方は bash や zsh にある機能で、これはtest1.txt test2.txt
に展開されてからコマンドに渡される。
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。