jq 在引号值中查找最大值



这是我的JSON test.json文件:

[
  {
    "name": "nodejs",
    "version": "0.1.21",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.20",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.11",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.9",
    "apiVersion": "v1"
  },
  {
    "name": "nodejs",
    "version": "0.1.8",
    "apiVersion": "v1"
  }
]

当我使用 max_by 时,jq返回 0.1.9 而不是 0.1.21 可能是由于引用的值:

cat test.json | jq 'max_by(.version)'
{
  "name": "nodejs",
  "version": "0.1.9",
  "apiVersion": "v1"
}

如何获取版本=0.1.21的元素?

语义

版本比较在jq中不受现成支持。您需要使用按.分割的字段

jq 'sort_by(.version | split(".") | map(tonumber))[-1]'

split(".").version中获取字符串并创建一个字段数组,即 0.1.21 成为[ "0", "1", "21"]数组,map(tonumber) 采用输入数组并将字符串元素转换为数字数组。

sort_by() 函数对从上一步生成的数组中的每个元素进行索引比较,并按升序与包含版本的对象进行排序,0.1.21在最后。[-1]表示法是从此排序数组中获取最后一个对象。

以下是使用 jq 的更一般答案的改编如何使用 JFrog CLI 按版本号对 Artifactory 软件包搜索结果进行排序?

def parse:
 [splits("[-.]")]
 | map(tonumber? // .) ;
max_by(.version|parse)

作为不太健壮的单行:

max_by(.version | [splits("[.]")] | map(tonumber))

相关内容

  • 没有找到相关文章

最新更新