当前位置:  开发笔记 > 运维 > 正文

如何对包含版本号的文本文件的行进行排序,格式为major.minor.build.revision数字?

如何解决《如何对包含版本号的文本文件的行进行排序,格式为major.minor.build.revision数字?》经验,为你挑选了1个好方法。

我有一个txt文件,其值如下:

3.6.4.2
3.6.5.1
3.6.5.10
3.6.5.11
3.6.5.12
3.6.5.13
3.6.5.2
3.6.7.1
3.6.7.10
3.6.7.11
3.6.7.2
3.6.7.3

我需要编写一个批处理脚本并返回一个已排序的输出.问题出在最后一栏,数字.10和.11应该在.3之后.我需要"最新版本"在底部,在这种情况下是3.6.7.11

在Linux中,我使用了"sort -t"." - k1n,1 -k2n,2 -k3n,3 -k4n,4"但我无法使用批处理脚本.

此外,由于某些原因,我不允许使用Cygwin或PowerShell.

在我的批处理代码中,我到目前为止只尝试了各种版本,但没有什么对我有用:

sort /+n versions.txt

这个问题中使用的输出很简单

sort versions.txt

看起来命令排序正确,直到我没有使用2位数字.



1> Aacini..:

这是批处理文件中的常见问题.所有排序方法都使用字符串比较,其中"10"出现在"2"之前,因此有必要在小于10的数字中插入左边的零.下面的批处理文件可以做到这一点,而不是生成一个固定的新文件数字,它使用它们来创建一个将自动排序的数组.之后,数组元素以其自然(排序)顺序显示.

编辑:我修改了代码,以管理四个部分中的两位数字.

@echo off
setlocal EnableDelayedExpansion

for /F "tokens=1-4 delims=." %%a in (input.txt) do (
    rem Patch the four numbers as a two digits ones
    set /A "a=100+%%a, b=100+%%b, c=100+%%c, d=100+%%d"
    rem Store line in the proper array element
    set "line[!a:~1!!b:~1!!c:~1!!d:~1!]=%%a.%%b.%%c.%%d"
)

rem Show array elements
for /F "tokens=2 delims==" %%a in ('set line[') do echo %%a

输出:

3.6.4.2
3.6.5.1
3.6.5.2
3.6.5.10
3.6.5.11
3.6.5.12
3.6.5.13
3.6.7.1
3.6.7.2
3.6.7.3
3.6.7.10
3.6.7.11


为每个数字添加100并且仅使用最后2位数字非常棒.并且使用环境变量以及命令__set__输出始终按名称排序的环境变量这一事实也很好.我比解决方案更喜欢这个解决方案.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有