jq: извлечь конкретный ключ из одного объекта в другой - PullRequest
0 голосов
/ 06 июня 2019

У меня есть два файла JSON.

file1.json:

{
  "Fruits": [
  {
    "name": "Apple",
    "something_else": 123,
    "id": 652090
  },
  {
    "name": "Orange",
    "something_else": 456,
    "id": 28748
  }
]}

file2.json:

{
  "Fruits": [
  {
    "weight": 5,
    "id": 652090
  },
  {
    "weight": 7,
    "id": 28748
  }
]}

Я хочу объединить объекты из обоих файлов, если они имеют общий ключ 'id', но извлечь из свойства file1 только свойство 'name'. Как мне сделать это с помощью JQ?

Вот что я хочу получить:

{
  "Fruits": [
  {
    "name": "Apple",
    "weight": 5,
    "id": 652090
  },
  {
    "name": "Orange",
    "weight": 7,
    "id": 28748
  },
]}

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Есть много способов, которыми это можно построить.Вот еще один способ:

$ jq '.Fruits |= (. + input.Fruits | [group_by(.id)[] | add | {name,weight,id}])' \
file1.json file2.json
{
  "Fruits": [
    {
      "name": "Orange",
      "weight": 7,
      "id": 28748
    },
    {
      "name": "Apple",
      "weight": 5,
      "id": 652090
    }
  ]
}
1 голос
/ 06 июня 2019

Объедините Fruits массивы, сгруппируйте их по id, выберите группы с 2 элементами, потому что мы хотим, чтобы фрукты присутствовали в обоих файлах.Для каждой выбранной группы;добавьте поле name из первый элемент группы в секунду и соберите результаты в массив.

jq -n '[inputs.Fruits[]]
| reduce (group_by(.id)[] | select(length==2)) as $f
  ([]; . + [$f[1] + ($f[0] | {name})])' file1.json file2.json

Обратите внимание, что файлы команд указаны в командестрока важна, файл с name s должен быть указан перед другим.


Объединение объектов с одинаковыми id и извлечение подмножества полей намного проще, хотя:

jq -n '[inputs.Fruits[]]
| group_by(.id)
| map(select(length==2) | add | {name, id, weight})
' file1.json file2.json
...