我有一个大型JSON文件,它是对象的对象,我想在对象键之后将其拆分为单独的文件名。是否可以使用jq或任何其他现成的工具来实现这一目标?
原始JSON采用以下格式
{ "item1": {...}, "item2": {...}, ...}
鉴于此输入,我想生成文件item1.json,item2.json等。
答案 0 :(得分:11)
这应该给你一个开始:
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
答案 1 :(得分:4)
这是一个只需要一次调用jq的解决方案:
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" }'
当然,如果密钥名称包含无法在文件名中使用的字符,则需要修改这些方法。
答案 2 :(得分:0)
是否可以使用jq 或任何其他现成的工具来实现?
是的。 Xidel也可以做您想做的事情:
for f in $(xidel -s input.json -e '$json()'); do
xidel -s input.json -e '$json("'$f'")' > $f.json
done