Unix版本号

时间:2010-12-20 19:39:34

标签: unix sorting

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

1.2.100.4
1.2.3.4
10.1.2.3
9.1.2.3

我希望对它们进行排序,以便按版本排序。即:

1.2.3.4
1.2.100.4
9.1.2.3    
10.1.2.3

我已尝试使用“k”参数使用各种排序命令,但实际上并不能很好地理解它。任何帮助,将不胜感激。

7 个答案:

答案 0 :(得分:102)

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

这是最终对我有用的命令:

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
  • 要跳过v前缀:sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n

答案 1 :(得分:69)

sort -V versions.txt

来自man sort

  

-V--version-sort
  文本中的自然种类(版本)

另见Details about version sort

答案 2 :(得分:3)

默认情况下,BSD不提供-V,因此Ben的解决方案尽可能接近。为方便起见,我在这里发布了能够对<label>-<version>.<ext>

等文件进行排序的版本
% 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

简短说明:

  • 列出要使用ls排序的文件。
  • 找到版本号并在其前面加上该行。
  • 在执行此操作时,将-1添加到最后以使较短的版本号排序(在.0偶数之前)。如果您认为-1等同于0,则可以将1.3更改为1.3.0
  • 使用Ben建议的解决方案对版本号进行排序。
  • 从该行中删除版本前缀。

该列表现在包含适用文件名的版本排序列表。 label部分的任何其他排序都留给读者练习。

答案 3 :(得分:1)

此命令:

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

答案 4 :(得分:0)

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
}

答案 5 :(得分:-3)

sort -n <versions.txt

答案 6 :(得分:-3)

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

你应该能够弄清楚其余部分。祝你好运