AWKでJSONを連結する

AWKで複数のJSONファイルを連結したかったので、それのメモ。Gruntが使える場合はgrunt-contrib-concatのbanner, separator, footerを使うと同様のことができる。

いくつかのJSONを用意する。

$ head *.json
==> aaa.json <==
{
    "aaa": 1
}

==> bbb.json <==
{
    "bbb": 2
}

==> ccc.json <==
{
    "ccc": 3
}

AWKスクリプトを用意する。

BEGIN {
  RS=""
  ORS=""
  print "{\"items\":["
}

{
  if (NR == 1) {
    print $0
  } else {
    print "," $0
  }
}

END {
  print "]}"
}

AWKにスクリプトとJSONのファイルを渡す。

$ awk -f concat.awk aaa.json bbb.json ccc.json
{"items":[{
    "aaa": 1
},{
    "bbb": 2
},{
    "ccc": 3
}]}

余計な空白などがあるが、それはファイルに出力したあとにnodeでrequireしてJSON.stringifyのあとにfs.writeFileSyncすれば良いと思う。

process.stdinがもう少し楽に扱えればawkからの出力をそのまま整形できるんだけど。