2016-11-29 80 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

最后一节奏效!你想介绍一下,这样我就能理解到底发生了什么? –