json - jq unique_by 选择排序后的第一个元素
问题描述
我有一系列具有相关信号级别的无线接入点。我想将其减少为具有最高信号的唯一 SSID。
# cat aps.json
{
"AP" : [
{ "SSID" : "Bart", "Signal" : -20 },
{ "SSID" : "Lisa", "Signal" : -19 },
{ "SSID" : "Homer", "Signal" : -91 },
{ "SSID" : "Homer", "Signal" : -92 },
{ "SSID" : "Lisa", "Signal" : -92 },
{ "SSID" : "Lisa", "Signal" : -21 },
{ "SSID" : "Homer", "Signal" : -90 },
{ "SSID" : "Bart", "Signal" : -21 },
{ "SSID" : "Bart", "Signal" : -22 }
]
}
我尝试使用 sort_by 按 Signal 进行排序,这似乎不知道负数。我使用 reverse 将最小的负数放在第一位。然后 unique_by 似乎没有选择第一个元素。
# jq '.AP | sort_by(.Signal) | reverse | unique_by(.SSID)' aps.json
[
{
"SSID": "Bart",
"Signal": -22
},
{
"SSID": "Homer",
"Signal": -92
},
{
"SSID": "Lisa",
"Signal": -19
}
]
似乎选择了流中的最后一个 Bart、Second Homer 和 First Lisa。
这个 jq unique_by - 选择剩余元素的答案似乎暗示这在 jq 的更高版本或至少 1.5 中已修复,但我正在运行 1.5
# jq --version
jq-1.5
解决方案
我认为问题是 unique_by() 在选择元素之前进行了预排序。即它正在使用我刚刚排序的数据。
答案是呈现预先排序到 unique_by() 的数据。
难题的最后一块是删除反向,因为 sort_by 可以否定字段。
这似乎奏效了。
# jq '.AP | sort_by(.SSID,-.Signal)| unique_by(.SSID)' aps.json
[
{
"SSID": "Bart",
"Signal": -20
},
{
"SSID": "Homer",
"Signal": -90
},
{
"SSID": "Lisa",
"Signal": -19
}
]
推荐阅读
- android - Scheduled JobService 仅在我打开我的应用程序时运行
- node.js - Node Js 复杂设计原则(Promise、async/await)
- google-cloud-speech - Google 语音转文本 API 密钥无效
- google-oauth - 向 G-Suite 、服务帐户的 OAuth 或服务器端 Web 应用程序的 OAuth 进行身份验证的最佳方法是什么
- sql-server - 升级 SQL Server 版本后出现问题,现在 services.msc 中有两台服务器
- javascript - 如何修复 Ajax 调用“参数字典包含一个空条目......”
- jquery - 同一日期但不同月份的月差
- c# - LINQ 执行流程(作业)
- assembly - MOVMSKB 操作有什么用?
- javascript - 将 Nuxt 迁移到 2.7:刷新循环