LoginSignup
26
23

More than 5 years have passed since last update.

Joinコマンドでテキスト結合はこうする

Posted at

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の大文字/小文字を無視
26
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23