Как сгруппировать по значению json, используя jq? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующее json

[
      {
        "certname": "server1",
        "environment": "production",
        "name": "memorysize",
        "value": "62.76 GiB"
      },
      {
        "certname": "server1",
        "environment": "production",
        "name": "processorcount",
        "value": 12
      },
      {
        "certname": "server2",
        "environment": "production",
        "name": "memorysize",
        "value": "62.76 GiB"
      },
      {
        "certname": "server2",
        "environment": "production",
        "name": "processorcount",
        "value": 10
      }
    ]

И я хочу преобразовать в этот формат, где он сгруппирован по имени сертификата. Проблема в том, что мне нужно использовать значение для того, чтобы сделать его ключом, как следует

    [
      {
        "certname": "server1",
        "memorysize": "62.76 GiB",
        "processorcount": 12
      },
      {
        "certname": "server2",
        "memorysize": "62.76 GiB",
        "processorcount": 10
      }
    ]

Как мне сделать это с помощью jq? Я пытался to_entries, но это тоже не помогает.

Спасибо

1 Ответ

1 голос
/ 05 февраля 2020

Ниже приведен прокомментированный скрипт jq. Не стесняйтесь использовать это как есть, или вычеркнуть новые строки и комментарии и использовать это как есть.

# First, we construct an object that maps each `$certname` to `{certname: $certname}`. We name it $init.

(map({key:.certname, value: {certname}}) | unique | from_entries) as $init |

# Next, we take each object of the input in turn (name it $attr) and assign its
# `name:value` into one of the objects.
# $init is the dictionary above
# Reduce will pass the current dictionary as . for each invocation, and the assignment
# returns the input object.

reduce .[] as $attr ($init; .[$attr.certname][$attr.name] = $attr.value) |

# Our initial dictionary has now been expanded with attributes.
# Map it back to an array of objects. .[] is a stream of objects,
# we capture that in an outer array.

[.[]]
...