【问题标题】:jq sort by version as stringjq 按版本排序为字符串
【发布时间】:2021-01-14 22:55:45
【问题描述】:

我正在尝试对以下 json 响应进行排序以选择最新版本:

[
    {
        "TagVersion": "1.0.11"
    },
    {
        "TagVersion": "1.1.8"
    },
    {
        "TagVersion": "1.0.10",
    },
    {
        "TagVersion": "1.0.9",
    },
    {
        "TagVersion": "1.0.77"
    }
]

正确的排序应该是:

    {
        "TagVersion": "1.0.9",
    },
    {
        "TagVersion": "1.0.10",
    },
    {
        "TagVersion": "1.0.11"
    },
    {
        "TagVersion": "1.0.77"
    },
    {
        "TagVersion": "1.1.8"
    }

我目前能够完成部分工作。它适用于简单的情况(所有版本的主要/次要/错误都有相同的位数)。

jq -r [.[]]|max_by(.TagVersion|split(".") | map(tonumber)

在我看来,最好的方法应该是在每个部分添加一个乘法。示例:

# With condition than every "part" as a maximum of 2 digits. It won't work with 3 digits

# Version 1.23.87

1 * 1000 + 23 * 10 + 87 = 1317

# Version 3.0.0
1 * 1000 + 0 * 10 + 0 = 3000

# Version 1.89.78
1 * 1000 + 89*10 + 78 = 1968

有人有实现这个的想法吗? ????

【问题讨论】:

  • 100% 正确。我的错。但你去的想法。 ??????

标签: json sorting version jq


【解决方案1】:

将每个分量变成一个数字,然后对整数数组进行排序。

jq 'sort_by(.TagVersion|split(".")|map(tonumber))'

输出:

[
  {
    "TagVersion": "1.0.9"
  },
  {
    "TagVersion": "1.0.10"
  },
  {
    "TagVersion": "1.0.11"
  },
  {
    "TagVersion": "1.0.77"
  },
  {
    "TagVersion": "1.1.8"
  }
]

【讨论】:

  • 这正是我所做的。但我认为不是 100% 的时间都在工作。这里有什么魔力? tonumber 不应该将 1.0.77 转换为 10771.1.8 转换为 118 吗? ?
  • @brcebn: split(".") 导致["1", "0", "77"];然后map(tonumber)tonumber 应用于每个元素,产生[1, 0, 77]jq 知道如何正确排序整数数组,以及如何按一个排序(如我的输出所示)。
猜你喜欢
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2015-01-15
  • 2019-11-13
  • 1970-01-01
  • 2014-07-02
相关资源
最近更新 更多