簡體   English   中英

Unix 版本號排序

[英]Unix sort of version numbers

我有一個版本號列表,例如,它們在文件 versions.txt 中

1.2.100.4
1.2.3.4
10.1.2.3
9.1.2.3

我希望對它們進行排序,以便它們按版本排序。 IE:

1.2.3.4
1.2.100.4
9.1.2.3    
10.1.2.3

我已經嘗試使用各種使用“k”參數的排序命令,但並沒有真正理解到足以實現它。 任何幫助,將不勝感激。

-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 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
文本中自然排序的(版本)數字

另請參閱有關版本排序的詳細信息

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.3等同於1.3.0 ,則可以將-1更改為0
  • 使用 Ben 建議的版本號解決方案對行進行排序。
  • 從行中刪除版本前綴。

該列表現在包含適用文件名的版本排序列表。 label部分的任何額外排序留給讀者作為練習。

這個命令:

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

在 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 -k1,1n

輸出:

1.2.100.4
1.2.3.4
9.1.2.3
10.1.2.3

您應該能夠弄清楚其余部分。 祝你好運

sort -n <versions.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM