使用 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
]
我有以下 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
]