我正在寻找允许我合并2个数组变量(不是文件)的JQ查询,并且还让我用第二个数组中的较新值覆盖第一个数组。例如:
#!/bin/bash -e
firstArrayVariable='
[
{
"Key": "A B",
"Value": "1 2"
},
{
"Key": "C D",
"Value": "3 4"
},
{
"Key": "E F",
"Value": "5 6"
},
{
"Key": "G H",
"Value": "9 10"
}
]
'
secondArrayVariable='
[
{
"Key": "A B",
"Value": "1 2"
},
{
"Key": "C D",
"Value": "3 4"
},
{
"Key": "G H",
"Value": "11 12"
},
{
"Key": "J K",
"Value": "15 16"
}
]
'
jq \
--compact-output \
--raw-output \
--arg jqSecondArrayVariable "${secondArrayVariable}" \
'. + $jqSecondArrayVariable // empty' \
<<< "${firstArrayVariable}"
我无法让它工作,我得到了以下错误
jq:error(at:19):array([{&#34; Key&#34;:&#34; A ...)和字符串(&#34; \ n [\ n ... ...)无法添加
我期望合并数组的结果是
[
{
"Key": "A B",
"Value": "1 2"
},
{
"Key": "C D",
"Value": "3 4"
},
{
"Key": "E F",
"Value": "5 6"
},
{
"Key": "G H",
"Value": "11 12"
},
{
"Key": "J K",
"Value": "15 16"
}
]
任何帮助都会非常感激!
已更新
我尝试使用--argjson
作为@peak建议,它连接数组但它无法合并2个数组。我现在得到的结果是一个包含重复对象的数组
答案 0 :(得分:2)
假设2个输入数组分别命名为firstArr
和secondArr
。
group_by()
(按关键键"Key"
分组对象)和 map()
函数:
jq --argjson arr1 "$firstArr" --argjson arr2 "$secondArr" -n \
'$arr1 + $arr2 | group_by(.Key) | map(.[-1])'
输出:
[
{
"Key": "A B",
"Value": "1 2"
},
{
"Key": "C D",
"Value": "3 4"
},
{
"Key": "E F",
"Value": "5 6"
},
{
"Key": "G H",
"Value": "11 12"
},
{
"Key": "J K",
"Value": "15 16"
}
]
或者在这种特殊情况下,您可以通过 unique_by()
功能以更快的方式应用以下技巧:
jq --argjson arr1 "$firstArr" --argjson arr2 "$secondArr" -n '$arr2 + $arr1 | unique_by(.Key)'
答案 1 :(得分:0)
你应该使用--argjson; --arg将其参数解释为JSON字符串。您还必须修改jq过滤器,因为只需添加数组就会导致它们连接。
有关进一步指导,请参阅例如javac options page for Java 9