我有一个版本号列表,比方说它们在一个文件版本中.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”参数使用各种排序命令,但实际上并不能很好地理解它。任何帮助,将不胜感激。
答案 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)
答案 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
。该列表现在包含适用文件名的版本排序列表。 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
你应该能够弄清楚其余部分。祝你好运