2015-11-17 16 views
4

刪除重複的JSON值我有以下的JSON:使用JQ

[ 
    { 
    "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"]}] 

所以我需要刪除無用的數據,然後得到一個名稱列表及其「版本」的唯一值。

我可以到哪裏我使用

jq '.[] | {name: .function, version: [.servers[].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?

回答

6

你幾乎在那裏。只是管version陣列到unique功能:

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

我在結束去重的溶液我很確定我已經嘗試過這一點,但所有的測試,我已經使它可能是錯的地方:) – Daniel

0

下面是一個使用減少收集版本鍵在一個臨時對象,並使用

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