jq 找到引用值中的最大值

Nic*_*ter 5 versioning json maxby jq

这是我的 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"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

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

如何获取 version=0.1.21 的元素?

Ini*_*ian 4

不支持开箱即用的语义版本jq比较。您需要尝试按以下方式分割字段.

jq 'sort_by(.version | split(".") | map(tonumber))[-1]'
Run Code Online (Sandbox Code Playgroud)

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

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