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_by
、jq
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))
这是我的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_by
、jq
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))