![将 JSON 数组拆分为多个文件](https://linux22.com/image/137680/%E5%B0%86%20JSON%20%E6%95%B0%E7%BB%84%E6%8B%86%E5%88%86%E4%B8%BA%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6.png)
我有一个如下所示的文件:
[
{
"billingAccountNumber": "x",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "1"
}
},
{
"billingAccountNumber": "y",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "2"
}
},
{
"billingAccountNumber": "z",
"paymentResponseObject": {
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "3"
}
}
]
数据看起来并不完全像这样,而且我有超过三个元素。我想根据这些数据创建三个文件:x.json
、y.json
和z.json
。我希望每个文件的内容都是paymentResponseObject
.
有没有办法做到这一点jq
?我已经弄清楚如何在 中执行此操作awk
,但它非常笨重,我希望能够使用不同的模式重复此过程。我必须awk
为每个模式重写 80% 的脚本。
答案1
从这所以线程:
jq -cr 'keys[] as $k | "\($k)\n\(.[$k])"' input.json | while read -r key; do
fname=$(jq --raw-output ".[$key].billingAccountNumber" input.json)
read -r item
printf '%s\n' "$item" > "./$fname"
done
答案2
尝试使用此代码来保存名称为0.json
,1.json
和 的每个元素2.json
。仅供参考,它可以适用于数组中任意数量的 JSON 项。
for i in $(seq $(jq '.|length' sample.json)); do \
j=$( expr $i - 1 ); \
jq ".[$j]" sample.json > $j.json; \
done
解释:
下面一行找到数组的长度来命名对象:
$(seq $(jq '.|length' sample.json))
由于数组以 0 开头,让我们修复输出文件名
j=$( expr $i - 1 );
下面几行从 json 文档中获取一个元素并保存到文件
jq ".[$j]" sample.json > $j.json;
从字面上保存到x.json
,y.json
和z.json
:
for i in x y z; do \
jq ".[$count]" sample.json > $i.json; \
count=$( expr $count + 1 ) \
done
答案3
为jq
您创建一个 shell 脚本:
jq -r '.[] |
@sh "cat >\(.billingAccountNumber).json <<\\END",
.paymentResponseObject,
"END"' file.json
这将获取 JSON 文档中的每个顶级数组元素,并为每个元素创建一个 shell 此处文档重定向。每个重定向到cat
都会被引用,以避免 shell 扩展文档中的内容。输出转到由值命名的文件,由中的格式化程序.billingAccountNumber
引用。@sh
jq
给定问题中的数据,这将创建脚本
cat >'x'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "1"
}
END
cat >'y'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "2"
}
END
cat >'z'.json <<\END
{
"uiErrorDipslayMessage": "",
"transactionStatus": "S",
"transactionDescription": "",
"transactionCode": "",
"confirmationNumber": "3"
}
END
可以通过sh
创建三个文件x.json
、y.json
、 并z.json
使用三个嵌入并引用的此处文档来运行。
运行它只需将其sh -s
直接从jq
.