業務でログ収集基盤に集約されたログを調査することがあるのですが、抽出したデータの整形の備忘録です。

前提

例として、マルチテナントのアプリケーションで何らかのデータ抽出やリソースのリストアップを行うことを考えます。

たとえばテナントIDと一緒に抽出されたこんな感じのデータ。

result.tsv

1 abc
2 def
2 ghi
3 jkl

生の結果のままだとサポート担当での対応が煩雑になったりするので、テナントごとに分割しておきたいシーンに出くわしました。

今回の例であれば、以下の3ファイルへ分割したい状況です。

1.csv

abc

2.csv

def
ghi

3.csv

jkl

awkでレコードの内容に基づいて出力先を変える

以下のように記述1することで意図した通りのファイル分割ができました。

$ mkdir tenants
$ cat result.tsv | awk -F'<tab>' -v 'OFS=<tab>' '{ print $2 > ("tenants/" $1 ".tsv") }'
$ ls tenants/
1.tsv 2.tsv 3.tsv
$ cat tenants/2.tsv
def
ghi

awk上でファイルを指定して書き出せることを知らなかったのでいろいろと使えそうです。

文字列や変数は空白を挟んで並べることで結合できますが、今回は演算子が入っていたので()で囲っておく必要がありました。


  1. コマンドライン上のタブ入力はC-v, <tab>で。 ↩︎