JQ - объединить два массива - PullRequest
0 голосов
/ 15 мая 2018

Я ищу 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: ошибка (при: 19): нельзя добавить массив ([{"Key": "A ...) и строку (" \ 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 голосов
/ 15 мая 2018

Предполагая, что 2 входных массива имеют имена firstArr и secondArr соответственно.

с 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)'
0 голосов
/ 15 мая 2018

Вы должны использовать -—argjson;—-Arg интерпретирует свой аргумент как строку JSON.Вам также придется изменить свой jq-фильтр, потому что простое добавление массивов приведет к их конкатенации.

Дополнительные сведения см., Например, Объединение JSON по общим парам ключ-значение

...