Linuxでテキスト加工をするときにとても便利なコマンドとしてjoinがあります。
このコマンドは、CSVやTSVをテーブル接続のように繋ぐことが出来ます
覚えておくと、csv加工が捗ります
例としてa.csvとb.csvを用意します
a.csv
100,apple
200,banana
400,cerry
700,date
b.csv
100,green
200,yellow
400,red
600,black
- 内部結合[join]
join -t, a.csv b.csv
#もしくは
join -t, -1 1 -2 1 -o 0 1.2 2.2 a.csv b.csv
結果
100,apple,green
200,banana,yellow
400,cerry,red
- 外部結合(右)
join -t, -a 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' b.csv a.csv
結果
100,green,apple
200,yellow,banana
400,red,cerry
700,NULL,date
- 外部結合(左)
join -t, -a 1 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' b.csv a.csv
結果
100,green,apple
200,yellow,banana
400,red,cerry
600,black,NULL
- 完全外部結合
join -t, -a 1 -a 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' a.csv b.csv
結果
100,apple,green
200,banana,yellow
400,cerry,red
600,NULL,black
700,date,NULL
- 一致しないモノだけ出力
join -t, -v 1 -v 2 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' a.csv b.csv
結果
600,NULL,black
700,date,NULL
オプションの説明
#区切り文字
-tx : xを区切り文字にする区切り文字
#キーにするフィールド
-1 x : 1つ目のファイルの第xフィールドを用いてjoinする
-2 x : 2つ目のファイルの第xフィールドを用いてjoinする
-a [ファイル番号1 or 2] : ファイルにあるペアにならなかった行を通常の出力に追加
-e [文字列] : 入力にフィールドがなかった場合はそれに対応する出力フィールドを[文字列]にする
-o [フォーマット] : 出力のフォーマット [例 0(キー)/1.1(1ファイル1列目)/2.2(2ファイル2列目)の意味]
-v [ファイル番号1 or 2] : ペアにならなかった行だけを出力
-i : keyの大文字/小文字を無視