シェルでCSVファイルを結合する方法

こんにちは、さるまりんです。

二つのCSVファイルからデータを抽出して結合する機会があったので、その手順を残しておこうと思います。

こんな2つのファイルがあります。

fruits-jp.csv

fr01,りんご
fr02,柿
fr03,ぶどう
fr04,もも
fr05,うめ
fr07,なし
fr09,スイカ

fruits-en.csv

fr01,apple
fr02,persimmon
fr03,grape
fr04,peach
fr05,plum
fr06,orange
fr08,lemon
fr10,melon

どちらもフルーツをコードと名称で持っています。
一つは日本語、一つは英語です。どちらか一方にしかないフルーツもあります。
この二つのファイルを読み込んで、日本語のファイルに、英語の名称を付け足したい、ないものは空欄で。

こんな感じです。

fr01,りんご,apple
fr07,なし,

これをシェルでやってみます。

実はjoinコマンドを使って一発でできます。

join -t ',' -a 1 -e '' -o '1.1,1.2,2.2' fruits-jp.csv fruits-en.csv > fruits-merged.csv

結果の結合されたファイルはこれです。

fruits-merged.csv

fr01,りんご,apple
fr02,柿,persimmon
fr03,ぶどう,grape
fr04,もも,peach
fr05,うめ,plum
fr07,なし,
fr09,スイカ,

joinコマンドで1列目のコードをキーに結合します。
次がコマンドのオプションの意味です。

-t ','で区切り文字でカンマを指定 (CSVファイル)
-a 1で左側のファイル(fruits-jp.csv)を基準に対応がない場合も出力
-e ''でない場合は空欄に
-o '1.1,1.2,2.2'で出力形式を「コード,日本語,英語」とに

-a 1 -e ''が今回のポイントです。日本語しかないものも表示し、なければ空にをこの二つのオプションがやってくれています。

joinコマンドはファイルがソートされていることを前提としてるので、そうでない場合は準備としてsortする必要があります。

sort fruits-jp.csv > fruits-jp-sorted.csv
sort fruits-en.csv > fruits-en-sorted.csv

join -t ',' -a 1 -e '' -o '1.1,1.2,2.2' fruits-jp-sorted.csv fruits-en-sorted.csv > fruits-merged.csv

これでOKです。

joinコマンド便利ですね。
こんな風に使える便利なものを作れるように頑張りたいと思います。

読んでくださってありがとうございました。

それではまた!