2019年8月26日月曜日

joinコマンドでファイルをマージする

ファイルをマージしようと思いjoinコマンドがあることは覚えていたのですが、使い方を完全に忘れていました。
アウトプットすることで記憶の定着を図ろうと思い、メモレベルですが記事にしたいと思います。
以下のような2つのファイルが存在した時、joinコマンドを使用することでマージすることができます。
2つのファイルをマージ
$ cat sample1.csv
1,115583271
2,115583272
3,115583283
4,115583294
5,115583295

$ cat sample2.csv
1,215583271
2,215583282
3,215583283
4,215583294
5,215583305

$ join -t',' sample1.csv sample2.csv > sample1_2.csv

$ cat sample1_2.csv
1,115583271,215583271
2,115583272,215583282
3,115583283,215583283
4,115583294,215583294
5,115583295,215583305
カラム数が違う場合でもマージできます。
以下は、上記でマージして作成したファイルに、さらに別ファイルをマージしている例です。
カラム数が違う場合でもマージ
$ cat sample3.csv
1,315583271
2,315583282
3,315583283
4,315583294
5,315583305

$ join -t',' sample1_2.csv sample3.csv > sample1_2_3.csv
$ cat sample1_2_3.csv
1,115583271,215583271,315583271
2,115583272,215583282,315583282
3,115583283,215583283,315583283
4,115583294,215583294,315583294
5,115583295,215583305,315583305
簡単にマージできました。
3つのファイルを一回でマージできないようなので、コマンドを組み合わせてマージ。
&&:前のコマンドが成功した場合のみ後続のコマンドを実行する。
&&でコマンドをつなげる
join -t',' sample1.csv sample2.csv > tmp.csv && join -t',' sample1_2.csv sample3.csv > sample1_2_3.csv && rm -i tmp.csv