我有一个看起来像这样的文件:
[
{
"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% 的脚本。
从这个SO 线程:
尝试使用此代码以使用名称保存每个元素
0.json
,1.json
和2.json
。仅供参考,它可以用于数组中任意数量的 JSON 项目。解释:
下面的行找到数组的长度来命名对象:
由于数组以 0 开头,让我们修复输出文件名
下面的行从 json 文档中获取一个元素并保存到文件
按字面意思保存到
x.json
,y.json
和z.json
:jq
为您创建一个 shell 脚本:这将获取 JSON 文档中的每个顶级数组元素,并为每个元素创建一个 shell here-document 重定向。每个重定向
cat
都被引用以避免外壳扩展文档中的内容。输出到由.billingAccountNumber
值命名的文件,@sh
由jq
.鉴于问题中的数据,这将创建脚本
这可以通过
sh
创建三个文件x.json
、y.json
和 ,并z.json
使用三个嵌入和引用的此处文档来运行。运行这将是
sh -s
直接从管道输入的问题jq
。