Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JQ合并一个文件中的两个JSON片段_Json_Jq - Fatal编程技术网

使用JQ合并一个文件中的两个JSON片段

使用JQ合并一个文件中的两个JSON片段,json,jq,Json,Jq,我得到了一个脚本的输出,该脚本将两个结构相同的JSON片段输出到一个文件中: { "Objects": [ { "Key": "somevalue", "VersionId": "someversion" } ], "Quiet": false } { "O

我得到了一个脚本的输出,该脚本将两个结构相同的JSON片段输出到一个文件中:

{
    "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)'