jq 找到引用值中的最大值

jq find the max in quoted values

这是我的JSONtest.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_byjq return 0.1.9 而不是 0.1.21 时,可能是由于引用的值:

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

如何获取 version=0.1.21 的元素?

Semantic version 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 对更一般的答案的改编

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

max_by(.version|parse)

作为一个不太健壮的 one-liner:

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