Unix版本号

Ben*_*Ben 62 unix sorting

我有一个版本号列表,比方说它们在一个文件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,4nr
  • 要跳过v前缀:sort -t. -k 1.2,1n -k 2,2n -k 3,3n -k 4,4n

  • 如果您的版本号以"v"开头(如v2.7.5),那么这将允许您对第一组的第二个字符进行排序:sort -r -t.-k __1.2,1n__ -k 2,2n -k 3,3n -k 4,4n (6认同)
  • 好问题.好答案.要颠倒顺序,添加一些'r'... sort -t.-k 1,1nr -k 2,2nr -k 3,3nr -k 4,4nr` (4认同)

Pik*_*ass 74

sort -V versions.txt
Run Code Online (Sandbox Code Playgroud)

来自man sort:

-V,--version-sort
文本中的自然类型(版本)数字

另请参阅版本排序详细信息.

  • 排序-V看起来很酷.不幸的是,此框中安装的排序不支持-V标志. (3认同)
  • 哪种版本的`sort`有这个?我的GNU`sort`副本(在OS X和Cent OS上)没有`-V`选项. (2认同)

Cor*_*oos 5

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甚至之前)。如果您认为等效于-10则可以更改1.31.3.0
  • 使用 Ben 建议的版本号解决方案对行进行排序。
  • 从行中剪掉版本前缀。

该列表现在包含适用文件名的版本排序列表。对label零件的任何额外排序都留给读者作为练习。

  • 实际上,BSD 实际上默认支持`-V`:https://www.freebsd.org/cgi/man.cgi?query=sort&amp;sektion=1 至少从 2012 年开始。我没有回到历史版本看看它什么时候更新,但 Apple 只是使用 BSD 工具的古老副本。 (4认同)

wil*_*ell -4

sort -n <versions.txt
Run Code Online (Sandbox Code Playgroud)

  • 不,他想要的是自然排序,而不是数字排序。 (3认同)