Nam*_*yen 5 arrays parsing json array-merge jq
我正在寻找 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}"
Run Code Online (Sandbox Code Playgroud)
我无法让它工作,并且出现以下错误
jq: error (at :19): array ([{"Key":"A ...) 和 string ("\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"
}
]
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
更新
我尝试--argjson按照@peak 的建议使用,它连接数组,但无法合并 2 个数组。我现在得到的结果是一个包含重复对象的数组
假设 2 个输入数组分别命名为firstArr和secondArr。
with group_by()(按关键键分组对象"Key")和map()函数:
jq --argjson arr1 "$firstArr" --argjson arr2 "$secondArr" -n \
'$arr1 + $arr2 | group_by(.Key) | map(.[-1])'
Run Code Online (Sandbox Code Playgroud)
输出:
[
{
"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"
}
]
Run Code Online (Sandbox Code Playgroud)
或者,在这种特殊情况下,一种更快的方法,您可以将以下技巧应用于unique_by()函数:
jq --argjson arr1 "$firstArr" --argjson arr2 "$secondArr" -n '$arr2 + $arr1 | unique_by(.Key)'
Run Code Online (Sandbox Code Playgroud)