web-dev-qa-db-ja.com

JSONファイルを別々のファイルに分割する

オブジェクトのオブジェクトである大きなJSONファイルがあり、オブジェクトキーの後に別のファイル名に分割したいと思います。 jqまたは他の既製のツールを使用してこれを達成することは可能ですか?

元のJSONは次の形式です

{ "item1": {...}, "item2": {...}, ...}

この入力を前提として、item1.json、item2.jsonなどのファイルを作成したいと思います。

10
kissaprofeetta

これはあなたにスタートを与えるはずです:

for f in `cat input.json | jq -r 'keys[]'` ; do
  cat input.json | jq ".$f" > $f.json
done

または、一部の人が好むように思われるような、より基本的な構文を主張する場合:

for f in $(jq -r 'keys[]') ; do
  jq ".[\"$f\"]" < input.json > "$f.json"
done < input.json
13
Hans Z.

Jqへの呼び出しが1回だけ必要なソリューションは次のとおりです。

jq -cr 'keys[] as $k | "\($k)\n\(.[$k])"' input.json |
  while read -r key ; do
    read -r item
    printf "%s\n" "$item" > "/tmp/$key.json"
  done

Jqコマンドの出力をawkにパイプする方が速い場合があります(例:

jq -cr 'keys[] as $k | "\($k)\t\(.[$k])"' input.json |
  awk -F\\t '{ print $2 > "/tmp/" $1 ".json" }'

もちろん、キー名にファイル名で使用できない文字が含まれている場合は、これらのアプローチを変更する必要があります。

5
peak

Jqまたは他の既製のツールを使用してこれを達成することは可能ですか?

です。 Xidel あなたが望むこともできます:

for f in $(xidel -s input.json -e '$json()'); do
  xidel -s input.json -e '$json("'$f'")' > $f.json
done
0
Reino