シェルで2つのcsvファイルを一行ずつ読み込み結合
大量のレコードに対し、2つのcsvファイルをシェルで結合する方法。
やりたかったのは、right.csvの各行に対して、left.csvの組み合わせを結合し、
出力ファイル(output.csv)を生成すること。
left.csv
number,name 01,hoge 02,fuga 03,hogehoge 04,fugafuga
right.csv
taskNumber,taskName 100,eat 200,sleep 300,walk 400,work
output.csv
number,name,taskNumber,taskName 01,hoge,100,eat 01,hoge,200,sleep 01,hoge,300,walk 01,hoge,400,work (省略) . . 04,fugafuga,400,work
ループ処理で1行ずつテキストを読み込む構文
while read ブロック変数 do 処理 done < 読み込みファイル
サンプルスクリプト
#!/bin/bash #出力ファイルの存在チェック #存在していれば削除 if [ -e output.csv ]; then rm -f output.csv fi #headコマンドでheaderのみを取得 #結合してoutput.csvへ出力 leftHeader=$(head -n 1 left.csv) rightHeader=$(head -n 1 right.csv) echo "${leftHeader},${rightHeader}" >> output.csv #headerを除いて一行ずつループで取得 #結合してoutput.csvへ出力 tail -n +2 left.csv | while read line1 do number=`echo ${line1} | cut -d , -f 1` name=`echo ${line1} | cut -d , -f 2` tail -n +2 right.csv | while read line2 do taskNumber=`echo ${line2} | cut -d , -f 1` taskName=`echo ${line2} | cut -d , -f 2` echo "${number},${name},${taskNumber},${taskName}" >> output.csv done done
スクリプト書いたら、実行して気長に待つ。。