我有一个版本号列表,比方说它们在一个文件versions.txt中
1.2.100.4
1.2.3.4
10.1.2.3
9.1.2.3
Run Code Online (Sandbox Code Playgroud)
我希望对它们进行排序,以便按版本排序.即:
1.2.3.4
1.2.100.4
9.1.2.3
10.1.2.3
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用"k"参数使用各种排序命令,但是不能很好地理解它以完成它.任何帮助,将不胜感激.
Ben*_*Ben 109
该-V选项是最好的,但我想远离安装新/其他软件走,因为我的排序没有这样的选择.
这是最终对我有用的命令:
sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n test.txt
Run Code Online (Sandbox Code Playgroud)
来自评论:
sort -t. -k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nrv前缀:sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n Pik*_*ass 74
sort -V versions.txt
Run Code Online (Sandbox Code Playgroud)
来自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
Run Code Online (Sandbox Code Playgroud)
简短说明:
ls。-1到最后以使较短的版本号首先排序(.0甚至之前)。如果您认为等效于-1,0则可以更改1.3为1.3.0。该列表现在包含适用文件名的版本排序列表。对label零件的任何额外排序都留给读者作为练习。
wil*_*ell -4
sort -n <versions.txt
Run Code Online (Sandbox Code Playgroud)