こんにちは、さるまりんです。
二つの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
コマンド便利ですね。
こんな風に使える便利なものを作れるように頑張りたいと思います。
読んでくださってありがとうございました。
それではまた!