2

我有一个文本文件,其中的条目表示带有版本和内部版本号的构建标签,其格式与 debian 包的格式相同,如下所示:

nimbox-apexer_1.0.0-12
nimbox-apexer_1.1.0-2
nimbox-apexer_1.1.0-1
nimbox-apexer_1.0.0-13 

使用 shell 脚本,我需要按 'version-build' 对上面的列表进行排序并得到最后一行,在上面的例子中是nimbox-apexer_1.1.0-2.

4

5 回答 5

3

通过以下方式获取最新版本:

cat file.txt | sort -V | tail -n1

现在,将其捕获到变量中:

BUILD=$(cat file.txt | sort -V | tail -n1)
于 2010-09-02T02:20:50.693 回答
1
cat file.txt | cut -d_ -f 2 | sed "s/-/./g" | sort -n -t . -k 1,2n -k 2,2n -k 3,3n  -k 4,3n

2n,3n 是认为在该字段中相关的字符数。如果您使用非常大的版本号,请增加它们...

于 2011-03-31T17:31:33.557 回答
1
sort -n -t "_" -k2.3 file | tail -1
于 2010-09-02T02:38:59.037 回答
0

使用 GNU sort

sort --version-sort file | tail -n -1

GNUtail不喜欢tail -1.

于 2010-09-02T02:51:19.237 回答
0

我还没有找到一个简单的方法来做到这一点。我一直在查看对 ip 地址进行排序的代码,这与我的问题类似,并试图将我的情况更改为那个。这是我想出的。请告诉我有一个更简单更好的方法!

sed 's/^[^0-9]*\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)-\([0-9]*\)/\1.\2.\3.\4 &/' list.txt | \
  sort -t . -n -k 1,1 -k 2,2 -k 3,3 -k 4,4 | \
  sed 's/^[^ ]* \(.*\)/\1/' | \
  tail -n 1

所以从这个数据开始:

nimbox-apexer_11.9.0-2
nimbox-apexer_1.10.0-9
nimbox-apexer_1.9.0-1
nimbox-apexer_1.0.0-12
nimbox-apexer_1.1.0-2
nimbox-apexer_1.1.0-1
nimbox-apexer_1.0.0-13

第一个sed将我的问题转换为排序 IP 问题,保留原始行以在最后反转更改:

11.9.0.2 nimbox-apexer_11.9.0-2
1.10.0.9 nimbox-apexer_1.10.0-9
1.9.0.1 nimbox-apexer_1.9.0-1
1.0.0.12 nimbox-apexer_1.0.0-12
1.1.0.2 nimbox-apexer_1.1.0-2
1.1.0.1 nimbox-apexer_1.1.0-1
1.0.0.13 nimbox-apexer_1.0.0-13 

使用sort前四个数字对行进行排序,在我的例子中代表 mayor.minor.release.build

1.0.0.12 nimbox-apexer_1.0.0-12
1.0.0.13 nimbox-apexer_1.0.0-13 
1.1.0.1 nimbox-apexer_1.1.0-1
1.1.0.2 nimbox-apexer_1.1.0-2
1.9.0.1 nimbox-apexer_1.9.0-1
1.10.0.9 nimbox-apexer_1.10.0-9
11.9.0.2 nimbox-apexer_11.9.0-2

最后sed消除用于排序的数据

nimbox-apexer_1.0.0-12
nimbox-apexer_1.0.0-13 
nimbox-apexer_1.1.0-1
nimbox-apexer_1.1.0-2
nimbox-apexer_1.9.0-1
nimbox-apexer_1.10.0-9
nimbox-apexer_11.9.0-2

最后tail得到我需要的最后一行。

于 2010-09-03T00:03:10.013 回答