0

这是我的示例数据,它是 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 更接近所需的输出?

4

1 回答 1

0
[.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)
于 2021-10-06T21:35:03.047 回答