【问题标题】:remove duplicates in JSON values using jq使用 jq 删除 JSON 值中的重复项
【发布时间】:2015-11-17 20:50:12
【问题描述】:

我有以下 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"]}]

所以我需要删除无用的数据,然后获取名称列表及其“版本”的唯一值。

我可以一直到我有的地方

{
  "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 吗?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    你快到了。只需将 version 数组传递给 unique 函数即可:

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

    【讨论】:

    • 我很确定我已经尝试过了,但是我所做的所有测试可能在某个地方是错误的 :)
    【解决方案2】:

    这是一个解决方案,它使用 reduce 在临时对象中收集版本密钥,并在最后使用 keys

    进行重复数据删除
     [
       . []
     | reduce .servers[].version as $v (
         {name, version:{}}
       ; .version[$v] = 1
       )
     | .version |= keys
     ]
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多