2012年11月1日木曜日

シェルスクリプトでCSVファイルのマージ

何か分かりにくい題名ですが…
例えば、こんな感じに一つのCSVファイルに一年間のデータが入っているとします。


それを下図みたいに、複数年をまとめて一つのCSVにしたい時もありますよね。たぶん。
 
dataディレクトリ下に1996.csv,1997.csv…の形式でデータがあるとしています。

#!/bin/sh 
min_year=1996
#ヘッダを書き込む
printf  "#data"
for i  in `seq $min_year $1`
do
    printf  ",$i"
done
echo    #改行
for line in `cat data/$1.csv`
do
#先頭の要素
        com=$(echo "$line" | cut -f1 -d",") 
 printf "$com"
 for i  in `seq $min_year $1`
 do
#二番目の要素
     h=$(grep "^$com," data/$i.csv | cut -f2 -d",")
#要素が無い場合
     if [ -z "$h" ]; then
  printf ",0"
     else
  printf ",$h"
     fi
 done
 echo 
done


CSVの一番目の要素をキーにgrepで各年のCSVを検索。存在しなければ0としてます。
重要なのはcutコマンド(IT pro シェル・スクリプト・リファレンス)で,これでCSVの要素が切り出せてます。
キー毎に毎回検索しているので、無茶苦茶に非効率です。
ただ、30分程度でこれを作った事を考えると、妥当なトレードオフかなぁとも。
シェルスクリプトマジ便利

0 件のコメント:

コメントを投稿