JQ-合并两个数组 [英] JQ - Merge two arrays
问题描述
我正在寻找JQ查询,该查询允许我合并2个数组变量(而不是文件),并带我用第二个数组中的较新值覆盖第一个数组.例如:
I'm looking for JQ query that allows me to merge 2 arrays variables (not files) and also take me to overwrite first array with newer value from second array. For example:
#!/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}"
我无法正常工作,并且出现以下错误
I could not get it to work and I got following error
jq:错误(:19):数组([{"Key":"A ...)和字符串(" \ n [\ n ...)
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个数组.结果我现在得到的是一个包含重复对象的数组
I tried to use --argjson
as @peak suggested, it concatenate array but it could not merge 2 arrays. Result I got now is an array with duplicated objects
推荐答案
假定2个输入数组分别命名为firstArr
和secondArr
.
Assuming that 2 input arrays are named as firstArr
and secondArr
respectively.
具有 group_by()
(用于通过关键键"Key"
对对象进行分组)和 map()
功能:
with group_by()
(to group objects by the crucial key "Key"
) and map()
functions:
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()
函数应用以下技巧:
Alternatively and in such particular case, a faster way, you could apply the following trick with unique_by()
function:
jq --argjson arr1 "$firstArr" --argjson arr2 "$secondArr" -n '$arr2 + $arr1 | unique_by(.Key)'
这篇关于JQ-合并两个数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!