JQ - 合并两个数组
JQ - Merge two arrays
我正在寻找 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 个数组。我现在得到的结果是一个包含重复对象的数组
你应该使用 --argjson
; --arg
将其参数解释为 JSON 字符串。您还必须修改您的 jq 过滤器,因为简单地添加数组将导致它们的串联。
如需进一步指导,请参阅
假设2个输入数组分别命名为firstArr
和secondArr
。
with 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)'
我正在寻找 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 个数组。我现在得到的结果是一个包含重复对象的数组
你应该使用 --argjson
; --arg
将其参数解释为 JSON 字符串。您还必须修改您的 jq 过滤器,因为简单地添加数组将导致它们的串联。
如需进一步指导,请参阅
假设2个输入数组分别命名为firstArr
和secondArr
。
with 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)'