【发布时间】:2020-02-24 09:17:41
【问题描述】:
我正在编写一个脚本,该脚本需要将传入的 json 解析为逐行数据,并从多个不同级别的 json 中获取信息。我正在使用jq 来解析数据。
传入的 json 是一个“任务”数组。每个任务[即数组的每个元素] 是一个看起来像这样的对象:
{
"inputData": {
"transfers": [
{
"source": {
"directory": "/path/to/source",
"filename": "somefile.mp3"
},
"target": {
"directory": "/path/to/target",
"filename": "somefile.mp3"
}
},
{
"source": {
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><delivery>content description</delivery>",
"encoding": "UTF-8"
},
"target": {
"directory": "/path/to/target",
"filename": "somefile.xml"
}
}
]
},
"outputData": {
"transferDuration": "00:00:37:10",
"transferLength": 187813298,
},
"updateDate": "2020-02-21T14:37:18.329Z",
"updateUser": "bob"
}
我想阅读所有任务,并为每个任务输出一行,由以下字段组成:
task[n].inputData.transfers[].target.filename, task[n].outputData.transferLength, task[n].updateDate
我的过滤器链可以正确选择适当的字段,甚至可以从task[].inputData.transfers[] 数组的多个条目中选择“正确”的单个条目,但是当我尝试获取多个元素的输出,链在数组上迭代三遍,我得到了
task[0].inputData.transfers[].target.filename
task[1].inputData.transfers[].target.filename
task[2].inputData.transfers[].target.filename
...
task[n].inputData.transfers[].target.filename
然后是所有元素的outputData.transferLength 字段的结果,
然后是所有元素的updateDate 字段的结果。
这是我的过滤器链:
'(.tasks[].inputData.transfers[] | select(.target.filename | match("[Xx][Mm][Ll]$")).target.filename), .tasks[].outputData.transferLength, .tasks[].updateDate'
我认为必须有一些有效的方法将数组中的每个元素的所有这些多级元素组合在一起;类似于 'with ...' 子句,例如 with tasks[] : blablabla,但不知道该怎么做。谁能帮忙?
【问题讨论】: