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

19
{"name": "John", "age": 30, "city": "New York"}
我有以下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可以实现吗?

2个回答

28

你已经接近成功了。只需将version数组传递给unique函数:

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

我非常确定我尝试过这个,但是在我进行的所有测试中可能有哪里出错了 :) - Daniel

2

这里有一个解决方案,它使用reduce在临时对象中收集版本键,并在最后使用keys进行去重。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接