Собирать объекты JSON с одинаковым значением атрибута и создавать новые пары ключ / значение - PullRequest
0 голосов
/ 15 ноября 2018

Вот упрощенный образец данных JSON, с которыми я работаю:

[
  { "certname": "one.example.com",
    "name": "fact1",
    "value": "value1"
  },
  { "certname": "one.example.com",
    "name": "fact2",
    "value": 42
  },
  { "certname": "two.example.com",
    "name": "fact1",
    "value": "value3"
  },
  { "certname": "two.example.com",
    "name": "fact2",
    "value": 10000
  },
  { "certname": "two.example.com",
    "name": "fact3",
    "value": { "anotherkey": "anothervalue" }
  }
]

Результат, который я хочу достичь, используя jq предпочтительно, следующий:

[
  {
    "certname": "one.example.com",
    "fact1": "value1",
    "fact2": 42
  },
  {
    "certname": "two.example.com",
    "fact1": "value3",
    "fact2": 10000,
    "fact3": { "anotherkey": "anothervalue" }
  }
]

Стоит отметить, что не все элементы имеют одинаковые пары имя / значение. Кроме того, значения часто являются сложными объектами сами по себе.

Если бы я делал это на Python, это не было бы большим делом (и да, сейчас я слышу, как хор "сделай это на Python" звучит у меня в ушах). Я хотел бы понять, как это сделать в jq, и это ускользает от меня в данный момент.

1 Ответ

0 голосов
/ 15 ноября 2018

... используя jq предпочтительно ...

Это дух!И в этом духе вот краткое решение:

map( {certname, (.name): .value} )
| group_by(.certname)
| map(add)

Конечно, есть и другие разумные решения.Если вышеописанное поначалу вызывает недоумение, вы можете добавить оператор debug здесь или там, или вы можете исследовать конвейер, выполнив первую строку самостоятельно и т. Д.

...