bash排序字母数字版本号

时间:2018-11-09 13:27:44

标签: bash macos gnu

我有一个从构建服务器获取的内部版本号列表,如下所示:

1.0.0.b1
1.0.0.b10
1.0.0.b11
1.0.0.b12
1.0.0.b13
1.0.0.b14
1.0.0.b15
1.0.0.b16
1.0.0.b17
1.0.0.b18
1.0.0.b19
1.0.0.b2
1.0.0.b20
1.0.0.b21
1.0.0.b22
1.0.0.b3
1.0.0.b4
1.0.0.b5
1.0.0.b6
1.0.0.b7
1.0.0.b8
1.0.0.b9

现在我需要按以下顺序对这个位置进行排序:

1.0.0.b1
1.0.0.b2
1.0.0.b3
1.0.0.b4
1.0.0.b5
1.0.0.b6
1.0.0.b7
1.0.0.b8
1.0.0.b9
1.0.0.b10
1.0.0.b11
1.0.0.b12
1.0.0.b13
1.0.0.b14
1.0.0.b15
1.0.0.b16
1.0.0.b17
1.0.0.b18
1.0.0.b19
1.0.0.b20
1.0.0.b21
1.0.0.b22

现在在Linux中使用GNU进行排序很容易-只需使用sort -V

但这也可以在我没有任何经验的macOS上工作,但是从测试中我知道-V在那里不工作。

我尝试过

sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n

但那里没有运气。

我想按版本/内部版本号对其进行排序,例如

1.1.3.b5高于1.0.3.b66

我在这里错过了什么?你能帮我么?另外,不幸的是,安装自制的coreutils并不是一种选择

谢谢你, br亚历克斯

3 个答案:

答案 0 :(得分:1)

我认为您的真实完整列表不会包含所有b版本。您需要将字段4拆分为两个键。一个用于字母部分,另一个用于数字部分。

$: sort -t. -k1n -k2n -k3n -k4.1,4.1 -k4.2n vnums
1.0.0.a5
1.0.0.a10
1.0.0.a13
1.0.0.a19
1.0.0.b1
1.0.0.b6
1.0.0.b8
1.0.0.b9
1.0.0.b12
1.0.0.b14
1.0.0.b17
1.0.0.b20
1.0.0.b21
1.0.0.b22
1.0.0.c3
1.0.0.c7
1.0.0.c15
1.0.0.c16
1.0.0.d2
1.0.0.d4
1.0.0.d11
1.0.0.d18
1.0.3.b66
1.1.3.b5

请注意,将字段4的alpha列限制为单个字符。

答案 1 :(得分:0)

将第四个键视为由子字段组成:

sort -t. -k1n,1 -k2n,2 -k3n,3 -k4.1,4.1 -k4.2n

答案 2 :(得分:0)

Perl单缸纸

假设不超过6位(或固定大小),sprintf "%06", $&将对剩下的用0填充的数字进行排序:

perl -e 'sub v{"@_"=~s/\d+/sprintf"%06d",$&/ger}print sort{v($a)cmp v($b)} <>' inputfile