JQ: объединить массив со списком объектов из другого файла - PullRequest
0 голосов
/ 04 августа 2020

Мне нужно добавить содержимое в мой основной файл с информацией из дополнительного файла.

Основной файл выглядит так:

[
  {
    "dynamic-parent-key-1": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1",
        "array-value-2"
      ]
    }
  },
  {
    "dynamic-parent-key-2": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1"
      ]
    }
  }
]

А дополнительный файл выглядит так :

{
  "fixedKey": [
    {
      "Key": "A",
      "Value": "abc"
    },
    {
      "Key": "B",
      "Value": "xyz"
    },
    {
      "Key": "C",
      "Value": "asd"
    }
  ]
}
{
  "fixedKey": [
    {
      "Key": "A",
      "Value": "aaa"
    },
    {
      "Key": "B",
      "Value": "bbb"
    },
    {
      "Key": "C",
      "Value": "ccc"
    }
  ]
}

Порядок элементов связан. Первый объект «fixedKey» соответствует «Dynami c -parent-key-1» и так далее. Первый файл соответствует JSON, а второй нет, это просто список JSON объектов, сохраненных в общем файле.

Мне нужен выходной файл (или просто обновите первый), поэтому в идеале это выглядит так:

{
  "master-key": {
    "dynamic-parent-key-1": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1",
        "array-value-2"
      ],
      "fixedKey": [
        {
          "Key": "A",
          "Value": "abc"
        },
        {
          "Key": "B",
          "Value": "xyz"
        },
        {
          "Key": "C",
          "Value": "asd"
        }
      ]
    },
    "dynamic-parent-key-2": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1"
      ],
      "fixedKey": [
        {
          "Key": "A",
          "Value": "aaa"
        },
        {
          "Key": "B",
          "Value": "bbb"
        },
        {
          "Key": "C",
          "Value": "ccc"
        }
      ]
    }
  }
}

Но если это невозможно или слишком сложно, я мог бы придерживаться первой файловой структуры и получить что-то вроде этого:

[
  {
    "dynamic-parent-key-1": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1",
        "array-value-2"
      ],
      "fixedKey": [
        {
          "Key": "A",
          "Value": "abc"
        },
        {
          "Key": "B",
          "Value": "xyz"
        },
        {
          "Key": "C",
          "Value": "asd"
        }
      ]
    }
  },
  {
    "dynamic-parent-key-2": {
      "key1": "value1",
      "key2": "value2",
      "array1": [
        "array-value-1"
      ],
      "fixedKey": [
        {
          "Key": "A",
          "Value": "aaa"
        },
        {
          "Key": "B",
          "Value": "bbb"
        },
        {
          "Key": "C",
          "Value": "ccc"
        }
      ]
    }
  }
]

Как я могу добиться этого? Я пробовал использовать map (), | =, +, но не могу. Должен ли я сначала подготовить вторичный файл, чтобы он соответствовал требованиям JSON, или в этом нет необходимости?

1 Ответ

1 голос
/ 04 августа 2020

Следующий сценарий должен работать для вас.

jq -n '{ "master-key": input | add | map_values(. + input) }' file1.json file2.json

Параметр -n (--null-input) отключает автоматическое c чтение входных потоков, чтобы вы могли обрабатывать каждый объект вручную (используя такие функции, как input или inputs). Первый вызов input загружает массив из вашего основного файла и add преобразует этот массив в объект. Затем map_values объединяет каждый подобъект с новым объектом, загруженным из входного потока (теперь во вторичном файле) последующими вызовами input.

...