join コマンド 2015/11/09
特定の列をキーにして、複数のファイルを行単位で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
に展開されてからコマンドに渡される。
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。