使用jq从内部数组中筛选只包含一个最大对象的JSON外部对象

使用jq从内部数组中筛选只包含一个最大对象的JSON外部对象,json,jq,Json,Jq,我有一个稍加修改的JSON文件,其中包含来自的iOS固件信息。这是一个简化版本: 输入 { "AppleTV5,3": { "firmwares": [ { "version": "9.2", "buildid": "13Y234" }, { "version": "9.1.1", "buildid": "13U717" }, { "versio

我有一个稍加修改的JSON文件,其中包含来自的iOS固件信息。这是一个简化版本:

输入

{
  "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]
相比,绝对是一个相对模糊的标记。但我并没有在这里讨论这个问题,而是在大家有机会参与讨论之前,我会暂缓提出标签建议。