2016-11-29 70 views
0

我目前正在嘗試通過REST api,which returns them in JSON array從PagerDuty獲取事件列表。我想通過在incident_key上使用unique_by()來刪除任何重複的事件。但是,我想要第一次出現incident_key,而unique_by()會除去最後一個。現在,如果我有incident_number 849,850,851,都具有相同的incident_key,unique_by()將返回851jq unique_by - 選擇其餘元素

簡單的例子:

[ 
{ "reference_key":"200", "id":"1" }, 
{ "reference_key":"200", "id":"2" }, 
{ "reference_key":"200", "id":"3" }, 
{ "reference_key":"201", "id":"4" }, 
{ "reference_key":"201", "id":"5" }, 
{ "reference_key":"201", "id":"6" } 
] 

我試圖做的是使用unique_by()根據id獲取reference_key的第一個匹配項。因此,在這種情況下,我願意輸出爲

[ 
{ "reference_key":"200", "id":"1" }, 
{ "reference_key":"201", "id":"4" } 
] 

的問題是,我已經在這個沒有控制權,並與數據我目前正在試圖用,它返回最後要做到這一點發生而不是第一次,如此。

[ 
{ "reference_key":"200", "id":"3" }, 
{ "reference_key":"201", "id":"6" } 
] 

我已經嘗試使用反向,然後調用unique_by(),但我得到相同的結果。有什麼辦法可以控制這個嗎?

回答

1

也許你的jq版本不夠新。使用JQ 1.5:

unique_by(.reference_key) 

產生

[{"reference_key":"200","id":"1"},{"reference_key":"201","id":"4"}] 

(如2016年1月18日(7835a72)的,內置的sort濾波器是穩定的;在此之前,穩定性是依賴於平臺的。)

如果您無法使用jq的最新版本,請考慮使用jq 1.3,1.4和1.5測試的以下內容:

def bucketize(f): 
    reduce .[] as $x ({}; .[$x|f] += [$x]); 

bucketize(.reference_key) | .[][0] 

或者更加經濟:

reduce .[] as $x ({}; 
    $x.reference_key as $key 
    | if .[$key] then . else .[$key] = $x end) 
| .[] 
+0

我想我的例子不是最好的,因爲它沒有工作,這個時候。我不知道爲什麼,但對於我目前從PagerDuty事件列表中獲得的數組,它會選擇最後一次出現。這裏是不unique_by和unique_by之間的差異。 http://i.imgur.com/3vSuoYT.png –

+0

最後一節奏效!你想介紹一下,這樣我就能理解到底發生了什麼? –