Unixsorting的版本号

我有一个版本号列表,比如说他们在一个文件版本.txt中

1.2.100.4 1.2.3.4 10.1.2.3 9.1.2.3 

我想对它们进行sorting,以便按版本sorting。 即:

 1.2.3.4 1.2.100.4 9.1.2.3 10.1.2.3 

我曾尝试使用“k”参数使用各种sorting命令,但不太了解它足以把它closures。 任何帮助,将不胜感激。

-V选项是最好的,但我想远离安装新的/其他软件,因为我的sorting没有这个选项。

这是最后为我工作的命令:

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

来自评论:

  • 要颠倒顺序: sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr
  • 跳过v前缀: sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n
 sort -V versions.txt 

man sort

-V ,– --version-sort
文本中自然的(版本)数字

另见有关版本sorting的详细信息 。

BSD默认不提供-V ,所以Ben的解决scheme是尽可能的。 为了您的方便,我在这里发布我们的版本,能够对<label>-<version>.<ext>这样的文件进行sorting:

 % ls bla-*.ime | sed -Ee 's/^(.*-)([0-9.]+)(\.ime)$/\2.-1 \1\2\3/' | sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 | cut -d\ -f2- bla-1.ime bla-1.0.ime bla-1.0.0.ime bla-1.1.ime bla-1.1.29.ime bla-1.2.3.ime bla-1.2.29.ime bla-1.2.30.ime bla-1.3.ime bla-1.3.0.ime bla-1.3.1.ime bla-1.3.10.ime bla-1.3.20.ime bla-1.7.ime bla-1.11.29.ime bla-2.3.2.ime bla-11.2.2.ime 

简短的解释:

  • 列出你想用lssorting的文件。
  • find版本号并在该行的前面加上前缀。
  • 这样做的时候加-1到最后使之更短的版本号sorting(在.0之前)。 如果您将1.3等同于1.3.0则可以将-1更改为0
  • 使用Benbuild议的解决scheme对版本号进行sorting。
  • 从行中删除版本前缀。

该列performance在包含适用文件名的版本sorting列表。 label部分的任何额外的sorting都作为练习留给读者。

在Perl中:

 sub compare_version_numbers { my ($l,$r) = @_; my @lx = split("\\.",$l); my @rx = split("\\.",$r); my $minlen = (@lx < @rx) ? @lx : @rx; for (my $i=0; $i < $minlen; $i++) { # make numeric by multiplying with 1 my $l_number = ($lx[$i] * 1); my $r_number = ($rx[$i] * 1); # compare with spaceship operator my $l_vs_r = ($l_number <=> $r_number); # return if decision is clear! if ($l_vs_r != 0) { return $l_vs_r } # otherwise, next part in array of version numbers } # if we are here, we could not decide - shortest entry wins! return @lx <=> @rx } 

这个命令:

 echo "1.2.100.4,1.2.3.4,10.1.2.3,9.1.2.3" | tr ',' '\n' | sort -V 

给出输出:

 1.2.3.4 1.2.100.4 9.1.2.3 10.1.2.3 
 sort -n <versions.txt 
 echo "1.2.100.4,1.2.3.4,10.1.2.3,9.1.2.3" | tr ',' '\n' | sort -k1,1n 

输出:

1.2.100.4
1.2.3.4
9.1.2.3
10.1.2.3

你应该能够找出其余的。 祝你好运