bashスクリプトでcsvファイル突合比較
Bashで2つのCSVファイルを突合する簡単なスクリプトを以下に示します。このスクリプトは、共通のキー(たとえばID列)を基にして2つのファイルを比較し、共通のレコードを出力します。joinコマンドを使用する方法です。
前提条件
突合するCSVファイルは、共通のキー(IDなど)でソートされていることが前提です。
CSVファイルの1列目がキーとして使用されるものとします。
スクリプト例
/* コード例 */
#!/bin/bash # CSVファイルのパス FILE1="file1.csv" FILE2="file2.csv" OUTPUT="output.csv" # ファイルがソートされていない場合は、まずソートしますsort -t, -k1,1 $FILE1 -o $FILE1 sort -t, -k1,1 $FILE2 -o $FILE2 # 共通のキーで突合し、結果を出力 join -t, -1 1 -2 1 $FILE1 $FILE2 > $OUTPUT echo "突合が完了しました。結果は${OUTPUT}に保存されています。"
スクリプトの説明
1. FILE1 と FILE2 に突合するCSVファイルのパスを指定します。
2. sortコマンドを使ってファイルをソートします。-t,でカンマ区切りを指定し、-k1,1で1列目(キー列)でソートします。
3. joinコマンドを使って2つのファイルを突合します。-t,でカンマ区切り、-1 1と-2 1で1列目をキーとして突合しています。
4. 結果はoutput.csvに保存されます。
注意点
joinコマンドでは、突合するキーの列が両方のファイルの同じ位置にある必要があります。
カスタマイズが必要な場合や複雑な処理を行いたい場合は、awkやcsvkitなど他のツールを使う方法もあります。
このスクリプトを実行すると、2つのCSVファイルの突合結果がoutput.csvに保存されます。
突合例題
joinコマンドの具体例を以下に示します。ここでは、2つのCSVファイルをID列を基にして突合し、共通のレコードを出力します。
ファイル例
file1.csv
1,Alice,25
2,Bob,30
3,Charlie,35
4,David,40
file2.csv
1,Engineer
2,Designer
3,Manager
5,Analyst
上記の例では、file1.csvとfile2.csvの1列目(ID列)を基にして突合します。
joinコマンドの使用例
以下のコマンドを実行します:
join -t, -1 1 -2 1 file1.csv file2.csv
コマンドの解説
-t,:区切り文字としてカンマ(,)を指定します。
-1 1:file1.csvの1列目をキーとして使用します。
-2 1:file2.csvの1列目をキーとして使用します。
実行結果
このコマンドを実行すると、以下のような出力が得られます:
1,Alice,25,Engineer
2,Bob,30,Designer
3,Charlie,35,Manager
IDが一致する行のみが結合され、file1.csvのデータにfile2.csvの職業が追加されている形です。
ファイル出力にする場合
もし、この結果を別のファイルに保存したい場合は、以下のようにリダイレクトを使います:
join -t, -1 1 -2 1 file1.csv file2.csv > output.csv
このようにすることで、突合結果がoutput.csvファイルに保存されます。
注意点
joinコマンドを使用するには、2つのファイルがキーでソートされている必要があります。ソートされていない場合は、以下のようにsortコマンドでソートしてから突合してください:
sort -t, -k1,1 file1.csv -o file1.csv
sort -t, -k1,1 file2.csv -o file2.csv
一致しなかった行
以下に、file1.csvとfile2.csvで一致しなかった行を出力する例を示します。
ファイル例
file1.csv
1,Alice,25
2,Bob,30
3,Charlie,35
4,David,40
file2.csv
1,Engineer
2,Designer
3,Manager
5,Analyst
一致しなかった行を出力するコマンド
file1.csvにのみ存在する行を出力
join -t, -1 1 -2 1 -v 1 file1.csv file2.csv
このコマンドでは、file1.csvのキーに対してfile2.csvに一致しない行が出力されます。
出力例:
4,David,40
file2.csvにのみ存在する行を出力
join -t, -1 1 -2 1 -v 2 file1.csv file2.csv
このコマンドでは、file2.csvのキーに対してfile1.csvに一致しない行が出力されます。
出力例:
5,Analyst
両方のファイルにおいて一致しなかった行を出力
両方のファイルにおいて一致しなかった行を両方とも取得したい場合、以下のように2回joinコマンドを実行することで可能です。
join -t, -1 1 -2 1 -v 1 file1.csv file2.csv > unmatched.csv
join -t, -1 1 -2 1 -v 2 file1.csv file2.csv >> unmatched.csv
この方法で、unmatched.csvに両ファイルで一致しなかったすべての行が出力されます。