使用 jq 删除 JSON 值中的重复项

remove duplicates in JSON values using jq

我有以下 JSON:

[
  {
    "function": "ping",
    "name": "start",
    "servers": [
      {
        "load": 581.6875,
        "last_heard": 2.379324197769165,
        "version": "1.0",
        "hidden": false,
        "pid": "19735"
      },
      {
        "load": 444.0625,
        "last_heard": 1.3227169513702393,
        "version": "1.0",
        "hidden": false,
        "pid": "12092"
      }
    ]
  },
  {
    "function": "pong",
    "name": "middle",
    "servers": [
      {
        "load": 581.6875,
        "last_heard": 2.379324197769165,
        "version": "2.0",
        "hidden": false,
        "pid": "19735"
      },
      {
        "load": 444.0625,
        "last_heard": 1.3227169513702393,
        "version": "3.0",
        "hidden": false,
        "pid": "12092"
      },
      {
        "load": 444.0625,
        "last_heard": 1.3227169513702393,
        "version": "3.0",
        "hidden": false,
        "pid": "12093"
      }
    ]
  },
  {
    "function": "pang",
    "name": "end",
    "servers": [
      {
        "load": 581.6875,
        "last_heard": 2.379324197769165,
        "version": "2.0",
        "hidden": false,
        "pid": "19735"
      },
      {
        "load": 444.0625,
        "last_heard": 1.3227169513702393,
        "version": "2.0",
        "hidden": false,
        "pid": "12092"
      }
    ]
  }
]

(这只是一个示例,它有数百个条目)

我需要的是得到

[{"name": "start", "version": ["1.0"]},
{"name": "middle", "version": ["2.0", "3.0"]},
{"name": "end", "version": ["2.0"]}]

所以我需要删除无用的数据,然后获取一个名称列表,其中包含 "version".

的唯一值

我能做到我所拥有的那一点

{
  "name": "ping",
  "version": [
    "1.0",
    "1.0"
  ]
}
{
  "name": "pong",
  "version": [
    "2.0",
    "3.0",
    "3.0"
  ]
}
{
  "name": "pang",
  "version": [
    "2.0",
    "2.0"
  ]
}

使用

jq '.[] | {name: .function, version: [.servers[].version]}'

但我需要删除重复的值。 这可能使用 jq 吗?

你快到了。只需将 version 数组通过管道传递给 unique 函数:

jq '[.[]|{name, "version": [.servers[].version]|unique}]' input

这是一个使用 reduce 在临时对象中收集版本密钥并在最后使用 keys[=11 删除数据的解决方案=]

 [
   . []
 | reduce .servers[].version as $v (
     {name, version:{}}
   ; .version[$v] = 1
   )
 | .version |= keys
 ]