Unix版本号
我有一个版本号列表,比如说,它们位于versions.txt文件中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
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