Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix版本号_Unix_Sorting - Fatal编程技术网

Unix版本号

Unix版本号,unix,sorting,Unix,Sorting,我有一个版本号列表,比如说,它们位于versions.txt文件中 1.2.100.4 1.2.3.4 10.1.2.3 9.1.2.3 我希望对它们进行排序,以便按版本进行排序。i、 e: 1.2.3.4 1.2.100.4 9.1.2.3 10.1.2.3 我曾经尝试过使用k参数使用各种排序命令,但我对它的理解还不够透彻,无法实现。任何帮助都将不胜感激 sort -n <versions.txt 从人类排序: -五、 -版本排序 文本中版本号的自然排序 另请参见。选项-V

我有一个版本号列表,比如说,它们位于versions.txt文件中

1.2.100.4
1.2.3.4
10.1.2.3
9.1.2.3
我希望对它们进行排序,以便按版本进行排序。i、 e:

1.2.3.4
1.2.100.4
9.1.2.3    
10.1.2.3
我曾经尝试过使用k参数使用各种排序命令,但我对它的理解还不够透彻,无法实现。任何帮助都将不胜感激

sort -n <versions.txt
从人类排序:

-五、 -版本排序 文本中版本号的自然排序

另请参见。

选项-V是最好的,但我不想安装新的/其他软件,因为我的sort没有该选项

这是最终对我起作用的命令:

sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n test.txt
从评论中:

要颠倒顺序:sort-t-k1,1nr-k2,2nr-k3,3nr-k4,4nr 跳过v前缀:sort-t-k1.2,1n-k2,2n-k3,3n-k4,4n 输出:

1.2.100.4 1.2.3.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
}
默认情况下,BSD不提供-V,因此Ben的解决方案非常接近。为了您的方便,我在这里发布了我们的版本,可以对文件进行排序,如-:

简要说明:

列出要使用ls排序的文件。 找到版本号并在该行前面加上前缀。 在执行此操作时,将-1添加到末尾,以使较短的版本号在.0之前先排序。如果你认为1.3等于1.3.0,你可以改变1到0。 使用Ben建议的版本号解决方案对行进行排序。 从行中切掉版本前缀。 该列表现在包含适用文件名的版本排序列表。标签部件上的任何附加排序都留给读者作为练习。

此命令:

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

不,他想要的是自然排序,不是数字排序。哪个版本的排序有这个功能?我在OS X和Cent OS上的GNU sort副本都没有-V选项。我使用的是Debian Sid,它目前有GNU coreutils 8.5.Ah,这里是:sort-V看起来很酷。很遗憾,此框上安装的排序不支持-V标志。您可以安装最新版本的排序。这个盒子的操作系统是什么?另一个解决方案是在网上找到一个程序。只要找一种自然的。我至少找到了一个PHP脚本。这正是我所期望的使用just-t-n、 正如您所期望的那样,每个字段都会按数字排序,字段中的值相同时,将延迟到右侧的下一个字段。我一直对自己的这种行为感到沮丧——终于知道如何做到这一点很好。问得好。回答得好。要颠倒顺序,请添加一些“r”。。。排序-t-k1,1nr-k2,2nr-k3,3nr-k4,4nr如果您的版本号以v开头,比如v2.7.5,那么这将允许您对第一组的第二个字符进行排序:sort-r-t-k1.2,1n-k2,2n-k3,3n-k4,4n不可信,今天仍然有用:相关:比较两个版本字符串:这应该更可读:1.2.3.4 1.2.100.4 9.1.2.3 10.1.2.3实际上,BSD默认支持-V:至少从2012年开始。我并没有回到历史版本去看它是什么时候更新的,但苹果只是在使用古老的BSD工具。谢谢!我不知道,但这是有道理的。
% 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
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