join コマンド

特定の列をキーにして、複数のファイルを行単位でJOINする。SQLのJOINみたいな。

キーに関係なく、単に行通しを結合するにはpasteコマンドを使う。

2つのタブ区切りのファイルをjoinする例

$ cat a.txt
1       Danny   29
2       Jess    24
3       Joey    29
4       D.J.    10
5       Steph   5
6       Michelle        0
$ cat b.txt
1       m
2       m
3       m
4       f
5       f
6       f
$ join -1 1 -2 1 a.txt b.txt
1 Danny 29 m
2 Jess 24 m
3 Joey 29 m
4 D.J. 10 f
5 Steph 5 f
6 Michelle 0 f

-1 1 は1つ目のファイルは1つ目のフィールドをキーにするという意味。 -2 1 は2つ目のファイルは1つ目のフィールドをキーにするという意味。

入力はタブ区切りでなくてもスペース区切りでもいい。区切り文字が複数連続していても1つの区切りとみなされるので、スペースで横位置を揃えてある固定長フィールドのファイルも意図通りの動作になる。

出力は単一のスペース区切りになる。

固定長フィールドのファイル処理の例

$ cat test1.txt
Danny    29 0
Jess     24 1
Joey     29 2
D.J.     10 3
Steph    5 4
Michelle 0 5
$ cat test2.txt
0 m
1 m
2 m
3 f
4 f
5 f
$ join -1 3 -2 1 test{1,2}.txt
0 Danny 29 m
1 Jess 24 m
2 Joey 29 m
3 D.J. 10 f
4 Steph 5 f
5 Michelle 0 f

-1 3 -2 1 は1つ目のファイルは3つ目のフィールドをキーにし、 2つ目のファイルは1つ目のフィールドをキーにする、という意味。

test{1,2}.txt という書き方は bash や zsh にある機能で、これはtest1.txt test2.txt に展開されてからコマンドに渡される。

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。