我有多个具有以下格式的JSON文件one.json
,two.json
,three.json
,我想使用jq
从它们创建一个合并数组。因此,我想从所有文件中提取Name
内的Value
和Parameters
字段,并使用它们创建一个数组,在其中将根据{构造id
值{1}}值和Name
字段将使用value
字段值构造。
输入:
one.json :
Value
two.json
{
"Parameters": [
{
"Name": "id1",
"Value": "one",
"Version": 2,
"LastModifiedDate": 1581663187.36
}
]
}
three.json
{
"Parameters": [
{
"Name": "id2",
"Value": "xyz",
"Version": 2,
"LastModifiedDate": 1581663187.36
}
]
}
输出:
{
"Parameters": [
{
"Name": "id3",
"Value": "xyz",
"Version": 2,
"LastModifiedDate": 1581663187.36
}
]
}
如何使用[
{
"id": "id1",
"value": "one"
},
{
"id": "id2",
"value": "xyz"
},
{
"id": "id3",
"value": "xyz"
}
]
答案 0 :(得分:2)
您可以使用reduce
表达式,而不是将整个文件插入内存(-s
);通过迭代操作输入文件内容,然后一次附加一个必填字段。
jq -n 'reduce inputs.Parameters[] as $d (.; . + [ { id: $d.Name, value: $d.Value } ])' one.json two.json three.json
-n
标志用于确保我们从头开始在inputs
函数提供的输入文件内容上构造输出JSON数据。由于reduce
以迭代方式工作,因此对于输入中的每个对象,我们将创建一个最终数组,并根据需要创建KV对。