使用jq从内部数组中筛选只包含一个最大对象的JSON外部对象
我有一个稍加修改的JSON文件,其中包含来自的iOS固件信息。这是一个简化版本: 输入使用jq从内部数组中筛选只包含一个最大对象的JSON外部对象,json,jq,Json,Jq,我有一个稍加修改的JSON文件,其中包含来自的iOS固件信息。这是一个简化版本: 输入 { "AppleTV5,3": { "firmwares": [ { "version": "9.2", "buildid": "13Y234" }, { "version": "9.1.1", "buildid": "13U717" }, { "versio
{
"AppleTV5,3": {
"firmwares": [
{
"version": "9.2",
"buildid": "13Y234"
},
{
"version": "9.1.1",
"buildid": "13U717"
},
{
"version": "9.1",
"buildid": "13U85"
}
],
"bdid": 52,
"name": "Apple TV 4 (2015)"
},
"AppleTV3,2": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
},
{
"version": "8.3",
"buildid": "12F69"
}
],
"bdid": 0,
"name": "Apple TV 3 (2013)"
},
"AppleTV3,1": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
},
{
"version": "8.3",
"buildid": "12F69"
},
{
"version": "8.2",
"buildid": "12D508"
}
],
"bdid": 0,
"name": "Apple TV 3"
}
}
{
"AppleTV5,3": {
"firmwares": [
{
"version": "9.2",
"buildid": "13Y234"
}
],
"bdid": 52,
"name": "Apple TV 4 (2015)"
},
"AppleTV3,2": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
}
],
"bdid": 0,
"name": "Apple TV 3 (2013)"
},
"AppleTV3,1": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
}
],
"bdid": 0,
"name": "Apple TV 3"
}
}
我想编写一个jq查询,返回每个外部对象,其中只包含firmware
数组中的最新固件对象。例如:
所需输出
{
"AppleTV5,3": {
"firmwares": [
{
"version": "9.2",
"buildid": "13Y234"
},
{
"version": "9.1.1",
"buildid": "13U717"
},
{
"version": "9.1",
"buildid": "13U85"
}
],
"bdid": 52,
"name": "Apple TV 4 (2015)"
},
"AppleTV3,2": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
},
{
"version": "8.3",
"buildid": "12F69"
}
],
"bdid": 0,
"name": "Apple TV 3 (2013)"
},
"AppleTV3,1": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
},
{
"version": "8.3",
"buildid": "12F69"
},
{
"version": "8.2",
"buildid": "12D508"
}
],
"bdid": 0,
"name": "Apple TV 3"
}
}
{
"AppleTV5,3": {
"firmwares": [
{
"version": "9.2",
"buildid": "13Y234"
}
],
"bdid": 52,
"name": "Apple TV 4 (2015)"
},
"AppleTV3,2": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
}
],
"bdid": 0,
"name": "Apple TV 3 (2013)"
},
"AppleTV3,1": {
"firmwares": [
{
"version": "8.4.1",
"buildid": "12H523"
}
],
"bdid": 0,
"name": "Apple TV 3"
}
}
我可以通过以下方式获得最新的固件
对象列表:
.[].firmwares | max_by(.version)
我可以通过以下方法仅从版本
获取值:
.[].firmwares | map(.version | values) | max
我可以使用固件
获取与特定版本
匹配的外部AppleTV对象:
[ . | to_entries[] | .value.firmwares |= map ( select ( .version == "8.3" ) ) ] | from_entries
但我似乎无法结合这些技术来获得我想要的输出。有人能帮忙吗?你应该把它看作是更新
固件
阵列。我们正在使用筛选版本更新它,其中选择了最大版本
.[].firmwares |= [ max_by(.version | split(".") | map(tonumber)) // empty ]
这里有一个解决方案,它使用reduce访问对象的每个键,并将相应的
.firmware
更新到最新版本
reduce keys[] as $i (
.
; .[$i].firmwares |= [max_by(.version)]
)
请注意,该版本是按词汇排序的。如果你想要更健壮的排序,你需要对每个数字进行分解、解析,然后根据这些数字进行排序。所以版本
10.1
总是在5.9
split
和fromjson
之后,这两个版本都要求jq>=1.4,我现在运行的是1.3(Fedora22)。考虑到1.5已经过时,可能值得升级。。。再次感谢。你一定要注意更新。虽然这个特殊的案例不需要来自JSON的,但它确实需要到数字。如果确实需要,您可能可以实现一个版本的split/1
。@jq170727请停止向已经回答的jq问题添加json标记。标签是为了吸引答案,这些问题回答得足够好,你基本上是农业代表。这是不赞成的,我将拒绝你今后在这方面的编辑@从你的评论和链接中我可以看出,我的活动让你感到困扰,让你相信我的意图是为了提高声誉,我为我的行为给你带来的困扰向你道歉。从我过去一个月的经历中,你可以很容易地看到我花了相当多的时间来回顾和回答jq相关的问题,在假期周末,我发现了大约100个我认为可以从[json]标签中获益的问题。我认为,如果[jq]问题中包含了标签,那么搜索json问题帮助的人将受益匪浅。我向你和社区提出的问题是,什么是正确的方法?@jq170727我也看到并欣赏你围绕jq问题(我也喜欢这个工具)所做的工作,我知道你不仅仅是一个机器人,而且我猜你的意图是好的。然而,我链接的元问题和这个页面不鼓励不必要的标签编辑。标签用于让专家了解需要回答/更多注意的问题。有相同问题的人会根据标题/问题文本找到它,这肯定会涉及“JSON”。此外,所有的[jq]问题都是关于JSON的,因此标记并没有带来相关专家更高的可视性。@Willbanwell该页面说“当您用适合该问题的知名和流行标记替换模糊或难以理解的标记时,您应该重新标记问题。”我认为[jq]
与[json]
相比,绝对是一个相对模糊的标记。但我并没有在这里讨论这个问题,而是在大家有机会参与讨论之前,我会暂缓提出标签建议。