jq在引用值中找到最大值

时间:2019-07-17 08:00:50

标签: json versioning jq maxby

这是我的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"
}

如何获取带有version = 0.1.21的元素?

2 个答案:

答案 0 :(得分:1)

{p> Semantic version不支持factanal(na.omit(ecases[v$items]), factors = 10, rotation = "promax") 中的开箱即用。您需要使用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 :(得分:1)

这里是使用jq在更一般的答案的改编 How to sort Artifactory package search result by version number with JFrog CLI?

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

max_by(.version|parse)

作为一种不太可靠的单行代码:

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