从 json 列表中选择具有最高内部版本号的 'name'
Selecting 'name' with highest build number from json list
这是我的示例数据,它是 Oracle 云上存储桶中的对象列表:
{
"objects": [
{
"name": "rhel/"
},
{
"name": "rhel/app-3.9.6.629089.txt"
},
{
"name": "rhel/app-3.11.4.629600.txt"
}
]
}
'/'之前的值部分是文件夹名称,之后是文件名。文件名中的最后一个数字是内部版本号。所需的输出是 rhel 文件夹中内部版本号最高的对象的名称:
$ jq -r 'some_program' file.json
rhel/app-3.11.4.629600.txt
我可以对数据进行一些处理以排除裸“rhel/”文件夹,如下所示:
$ jq -r '.objects[] | select(.name|test("rhel/."))' file.json
{
"name": "rhel/app-3.9.6.629089.txt"
}
{
"name": "rhel/app-3.11.4.629600.txt"
}
当我尝试在 jq 期间拆分它时抛出错误:
$ jq -r '.objects[] | select(.name|test("rhel/.")) | split(".")' file.json
jq: error (at file.json:1): split input and separator must be strings
我期望在拆分结果上使用 'map(tonumber)[-2]' 并将整体包装在 'max_by()' 中。
如何使用 jq 更接近所需的输出?
[.objects[]
| select(.name|test("rhel/."))]
| max_by(.name|split(".")[-2]|tonumber)
产生:
{
"name": "rhel/app-3.11.4.629600.txt"
}
如果您只想要名称,您可以先提取它们:
[.objects[].name|select(test("rhel/."))]
| max_by(split(".")[-2]|tonumber)
这是我的示例数据,它是 Oracle 云上存储桶中的对象列表:
{
"objects": [
{
"name": "rhel/"
},
{
"name": "rhel/app-3.9.6.629089.txt"
},
{
"name": "rhel/app-3.11.4.629600.txt"
}
]
}
'/'之前的值部分是文件夹名称,之后是文件名。文件名中的最后一个数字是内部版本号。所需的输出是 rhel 文件夹中内部版本号最高的对象的名称:
$ jq -r 'some_program' file.json
rhel/app-3.11.4.629600.txt
我可以对数据进行一些处理以排除裸“rhel/”文件夹,如下所示:
$ jq -r '.objects[] | select(.name|test("rhel/."))' file.json
{
"name": "rhel/app-3.9.6.629089.txt"
}
{
"name": "rhel/app-3.11.4.629600.txt"
}
当我尝试在 jq 期间拆分它时抛出错误:
$ jq -r '.objects[] | select(.name|test("rhel/.")) | split(".")' file.json
jq: error (at file.json:1): split input and separator must be strings
我期望在拆分结果上使用 'map(tonumber)[-2]' 并将整体包装在 'max_by()' 中。
如何使用 jq 更接近所需的输出?
[.objects[]
| select(.name|test("rhel/."))]
| max_by(.name|split(".")[-2]|tonumber)
产生:
{
"name": "rhel/app-3.11.4.629600.txt"
}
如果您只想要名称,您可以先提取它们:
[.objects[].name|select(test("rhel/."))]
| max_by(split(".")[-2]|tonumber)