Bash
awk

テーブルから出力したクエリ結果のファイルをカラムの値ごとに分割したい@bash

よくある状況

DBから社内の営業部ごとのモニタリング指標を引っこ抜いてきたとします。

担当部署 指標1 指標2
営業部A 1234 0.123
営業部A 5678 0.456
営業部B 9999 0.789

これをあるカラム、ここでは 担当部署 ごとにファイルを分けたいとします。
即ち、こんな感じのファイル郡を得たい。

営業部A.csv
営業部B.csv
営業部C.csv
...

各営業部に、彼らが知りたいモニタリング指標をファイルの形で与えるようなシチュエーションですね。
可能ならBIツールで見せたいところですが、Excelで開けないとそもそも見てもらえなかったりするわけです。

bash+awkで手軽に

やりたいことは単純なのでpython等の練習がてら丁度よいと思います。
しかしここはbashとawkでさっくりやってみましょう。
DBから引っこ抜いてきた上記のテーブルを、
output.tsvというヘッダ付きタブ区切りファイルに保存しているとします。

awkでカラムの値ごとにファイルを分割する

split.sh
awk -F'\t' '{
  if (NR>1)
  {
    TGT=$1; # ファイル分割の基準にしたいカラムのフィールド順を指定。
    gsub("\"","",TGT);  # ダブルクオーテーションが邪魔な場合は除いておく
    FILE=sprintf("PREFIX_%s.tsv", TGT);
    print $0 >> FILE;
  }
}' output.tsv

指定したカラムの値をファイル名にそのまま使って、
そのファイルにprint $0 >>で吐き出しているだけです。
最初の行だけはヘッダなのでNR>1で飛ばしています。

ヘッダをつけよう

bashでヘッダもつけます。

split.sh
HEADER=`awk NR==1 $1`
sed -i "1s/^/${HEADER}\n/" PREFIX_*.tsv

ファイルパスに使えない文字列が入ってきたりすると厳しいので、
そのあたりのエスケープ処理は考えたほうがよいです。。。

ファイル分割は出来た。次は・・?

とりあえずの目標は達成できました。
しかしよくある状況は続くのでした。