我正在寻找 JQ 查询,它允许我合并 2 个数组变量(不是文件),并带我用第二个数组中的较新值覆盖第一个数组。例如:
#!/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 ([{"Key":"A ...) and string ("\n [\n ...) cannot be added
我期望的合并数组的结果是
[
{
"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"
}
]
任何帮助将不胜感激!
更新
我尝试按照@peak 的建议使用
--argjson
,它连接数组,但无法合并 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)'
关于arrays - JQ - 合并两个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50354926/