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)
| .[]
我目前正在尝试通过 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)
| .[]