Создать объединенный массив JSON из нескольких файлов, используя jq - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть несколько JSON файлов one.json, two.json, three.json в следующем формате, и я хочу создать из них консолидированный массив, используя jq. Итак, из всех файлов я хочу извлечь поля Name и Value внутри Parameters и использовать их для создания массива, в котором значение id будет построено из значения Name и поля value будет построен с использованием значения поля Value.

вход:
один. json:

{
  "Parameters": [
    {
      "Name": "id1",
      "Value": "one",
      "Version": 2,
      "LastModifiedDate": 1581663187.36

    }
  ]
}

два. json

{
  "Parameters": [
    {
      "Name": "id2",
      "Value": "xyz",
      "Version": 2,
      "LastModifiedDate": 1581663187.36

    }
  ]
}

три. json

{
  "Parameters": [
    {
      "Name": "id3",
      "Value": "xyz",
      "Version": 2,
      "LastModifiedDate": 1581663187.36

    }
  ]
}

выход:

[
  {
    "id": "id1",
    "value": "one"
  },
  {
    "id": "id2",
    "value": "xyz"
  },
  {
    "id": "id3",
    "value": "xyz"
  }
]

Как этого добиться, используя jq

1 Ответ

2 голосов
/ 24 февраля 2020

Вы можете использовать выражение reduce вместо удаления всего файла в память (-s); итеративным манипулированием содержимым входного файла и последующим добавлением обязательных полей по одному.

jq -n 'reduce inputs.Parameters[] as $d (.; . + [ { id: $d.Name, value: $d.Value } ])' one.json two.json three.json

Флаг -n предназначен для обеспечения того, чтобы мы создавали выходные данные JSON с нуля по содержимому входного файла, доступному через функцию inputs. Поскольку reduce работает итеративно, для каждого объекта на входе мы создаем окончательный массив, создавая пару KV по желанию.

...