使用JQ合并一个文件中的两个JSON片段
我得到了一个脚本的输出,该脚本将两个结构相同的JSON片段输出到一个文件中:使用JQ合并一个文件中的两个JSON片段,json,jq,Json,Jq,我得到了一个脚本的输出,该脚本将两个结构相同的JSON片段输出到一个文件中: { "Objects": [ { "Key": "somevalue", "VersionId": "someversion" } ], "Quiet": false } { "O
{
"Objects": [
{
"Key": "somevalue",
"VersionId": "someversion"
}
],
"Quiet": false
}
{
"Objects": [
{
"Key": "someothervalue",
"VersionId": "someotherversion"
}
],
"Quiet": false
}
我希望通过JQ将此输出传递给一个Objects[]列表,将两个列表中的所有对象连接起来,并输出相同的整体结构。我可以通过在两个单独的JQ命令之间进行管道连接来完成:
jq '.Objects[]' inputfile | jq -s '{"Objects":., "Quiet":false}' -
但我想知道是否有一种更优雅的方法可以使用一次JQ调用来实现这一点
我目前正在使用JQ 1.5版,但如果需要,可以进行更新。您不需要在那里调用JQ两次。可以使用关键字获取第二个对象
您可以使用
reduce
:
jq -s 'reduce .[] as $item ({ Quiet: false }; .Objects += $item.Objects)'
看到了
正如@oguz ismail在评论中所建议的那样,-s
(slurp)标志可以通过使用输入来删除,以获得第一个条目之后的其余条目:
jq 'reduce inputs as $item (.; .Objects += $item.Objects)'
看到了
这两个版本都可以处理输入中任意数量的条目(第二个版本至少需要一个)。@oguzismail它可能会按照您的建议工作,但是您可能会得到另一个改进,如“我们真的需要使用减少?”这样,我的解决方案一点一点地演变为您的解决方案:-)我喜欢您的解决方案,这是解决当前问题的最短、可能也是最快的解决方案,对此毫无疑问。但这是我的,我喜欢它现在的样子-D@oguzismail我喜欢您为我所拥有的非常具体的用例提供的较短的版本,涉及2个输入对象,但是您是对的,这个解决方案处理超过2个的情况,并且您建议的修改有效。最初我确实想弄清楚如何“减少”,但没有完全正确!谢谢你们,非常有帮助。真的很好!非常感谢。
jq 'reduce inputs as $item (.; .Objects += $item.Objects)'