JQ - 合并两个数组

时间:2018-05-15 16:18:17

标签: arrays json parsing jq array-merge

我正在寻找允许我合并2个数组变量(不是文件)的JQ查询,并且还让我用第二个数组中的较新值覆盖第一个数组。例如:

#!/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([{&#34; Key&#34;:&#34; A ...)和字符串(&#34; \ 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"
    }
]

任何帮助都会非常感激!

已更新

我尝试使用--argjson作为@peak建议,它连接数组但它无法合并2个数组。我现在得到的结果是一个包含重复对象的数组

2 个答案:

答案 0 :(得分:2)

假设2个输入数组分别命名为firstArrsecondArr

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

答案 1 :(得分:0)

你应该使用--argjson; --arg将其参数解释为JSON字符串。您还必须修改jq过滤器,因为只需添加数组就会导致它们连接。

有关进一步指导,请参阅例如javac options page for Java 9