Unix 用jq减少JSON

Unix 用jq减少JSON,unix,jq,Unix,Jq,我有一个JSON对象数组: [{key1: value},{key2:value}, ...] 我想将其简化为以下结构: {key1: value, key2: value, ...} 这可能和你的工作有关吗 我试着: cat myjson.json | jq '.[] | {(.key): value}' 这不太有效,因为它会在每个基准面上迭代,而不是将其缩减为一个对象。我相信以下方法会起作用: cat myjson.json | jq 'reduce .[] as $item ({}

我有一个JSON对象数组:

[{key1: value},{key2:value}, ...]
我想将其简化为以下结构:

{key1: value, key2: value, ...} 
这可能和你的工作有关吗

我试着:

cat myjson.json | jq '.[] | {(.key): value}'

这不太有效,因为它会在每个基准面上迭代,而不是将其缩减为一个对象。

我相信以下方法会起作用:

cat myjson.json | jq 'reduce .[] as $item ({}; . + $item)'

它获取数组中的每个项,并将其添加到前面所有项的总和中。

请注意,jq有一个名为“add”的内置函数,与第一个答案所建议的相同,因此您应该能够编写:

jq add myjson.json

要稍微扩展其他两个答案,可以将两个对象“添加”在一起,如下所示:

.[0] + .[1]

=> { "key1": "value", "key2": "value" }
您可以使用generic
reduce
函数在列表的前两项之间重复应用函数,然后在该结果和下一项之间重复应用函数,依此类推:

reduce .[] as $item ({}; . + $item)
我们从
{}
开始,添加
[0]
,然后添加
[1]

最后,为了方便起见,jq有一个
add
函数,它本质上就是这个函数的别名,因此您可以将整个过程写成:

add
或者,作为完整的命令行:

jq add myjson.json

cat myjson.json | jq.[].
是否在单独的一行上输出每个对象?如果是这样的话,那么您可以将其传输到其他内容(例如
sed
):
cat myjson.json | jq'.[]。| sed':a;N、 美元!文学士;S/} \ {,/G’< /代码> @乌龟,在浏览旧问题时,我注意到这已经有一段时间了。也许可以考虑标记一个答案,如果它满足了你的需要?