如何比较两个文件中数组的每个对象中常见的一个字段,并同时更新数组

时间:2018-03-31 09:40:31

标签: merge grouping jq

  

示例 input1.json


[{
    "organizationId": "org1",
    "test1": "UP",
    "key1": "value1"
}, 
{
    "organizationId": "org2",
    "test1": "UP",
    "key1": "value3"
}]

  

示例 input2.json


[{
    "organizationId": "org1",
    "test2": "DOWN",
    "key1": "value4"
}, 
{
    "organizationId": "org3",
    "test2": "DOWN",
    "key1": "value5"
}]

  

预期 output.json


[{
        "organizationId": "org1",
        "test1": "UP",
        "key1": "value4",
        "test2": "DOWN"
    },
    {
        "organizationId": "org2",
        "test1": "UP",
        "key1": "value3"
    },
    {
        "organizationId": "org3",
        "test2": "DOWN",
        "key1": "value5"
    }
]

输入是两个文件的数组对象。我的目标是合并两个对象,如果它们具有相同的值并保持其他对象不变。我通过分组

部分实现了这一目标

jq -s '[ .[0] + .[1] | group_by(.organizationId)[] | select(length > 1) |add ]' ìnput1.json input2.json

organizationId 对对象进行分组。在这两个输入中,&#34; organizationId&#34;:&#34; org1&#34; 可用,因此可以对其进行分组。现在我遇到的问题是我从 input1.json <中丢失了其他对象&#34; organizationId&#34;:&#34; org2&#34; / strong>和&#34; organizationId&#34;:&#34; org3&#34; 来自 input2.json ,它们并不存在于每个其他文件中。

实现了分组的基本原则,但即使没有匹配,我也需要保留两个文件中的任何其他对象。如果我们想保留其他对象,我们应该使用 group_by 吗?如果没有,我如何使用 jq

实现预期的输出

1 个答案:

答案 0 :(得分:0)

对于更广泛的受众,获取所有对象(分组和未分组)的解决方案,请使用下面的

jq -s '[ .[0] + .[1] | group_by(.organizationId)[] |add ]' ìnput1.json input2.json

如果只是分组对象,则在下面使用。

jq -s '[ .[0] + .[1] | group_by(.organizationId)[] | select(length > 1) | add ]' ìnput1.json input2.json

我不得不说 jq如此强大! :)