jq unique_by - 选择剩余元素

jq unique_by - Choose remaining element

我目前正在尝试通过 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() 将 return 851。

简单示例:

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

问题是我无法控制这一点,并且根据我目前正在尝试执行此操作的数据,它是 return 最后一次出现而不是第一次出现,就像这样。

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

我试过使用反向然后调用 unique_by(),但我得到了相同的结果。有什么办法可以控制这个吗?

可能您的 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)
| .[]