jq:按属性分组和键

rep*_*lay 16 grouping json key jq

我有一个对象列表,如下所示:

[
  {
    "ip": "1.1.1.1",
    "component": "name1"
  },
  {
    "ip": "1.1.1.2",
    "component": "name1"
  },
  {
    "ip": "1.1.1.3",
    "component": "name2"
  },
  {
    "ip": "1.1.1.4",
    "component": "name2"
  }
]
Run Code Online (Sandbox Code Playgroud)

现在,我想对组件进行分组和键入,并为每个组件分配一个ips列表:

{
  "name1": [
    "1.1.1.1",
    "1.1.1.2"
  ]
},{
  "name2": [
    "1.1.1.3",
    "1.1.1.4"
  ]
}
Run Code Online (Sandbox Code Playgroud)

rep*_*lay 24

我自己想通了.我首先分组.component,然后只创建由每个组的第一个对象的组件索引的新的ips列表:

jq ' group_by(.component)[] | {(.[0].component): [.[] | .ip]}'

  • @branquito不能。对象键始终是JSON中的字符串。如果您有类似`{“ 0”:1}`之类的JSON,则可以使用`。“ 0”`获得`“ 0”`键。 (2认同)

yac*_*cob 17

接受的答案不会产生有效的 json,但是:

{
  "name1": [
    "1.1.1.1",
    "1.1.1.2"
  ]
}
{
  "name2": [
    "1.1.1.3",
    "1.1.1.4"
  ]
}
Run Code Online (Sandbox Code Playgroud)

name1以及name2是有效的 json 对象,但整个输出不是。

以下jq语句会产生问题中指定的所需输出:

group_by(.component) | map({ key: (.[0].component), value: [.[] | .ip] }) | from_entries
Run Code Online (Sandbox Code Playgroud)

输出:

group_by(.component) | map({ key: (.[0].component), value: [.[] | .ip] }) | from_entries
Run Code Online (Sandbox Code Playgroud)

欢迎提出更简单方法的建议。

如果人类可读性优于有效的 json,我建议像......

{
  "name1": [
    "1.1.1.1",
    "1.1.1.2"
  ],
  "name2": [
    "1.1.1.3",
    "1.1.1.4"
  ]
}
Run Code Online (Sandbox Code Playgroud)

...这导致...

IPs for name1: ["1.1.1.1","1.1.1.2"]
IPs for name2: ["1.1.1.3","1.1.1.4"]
Run Code Online (Sandbox Code Playgroud)