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个输入数组分别命名为firstArrsecondArr

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)'