我有一个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
Run Code Online (Sandbox Code Playgroud)
我需要编写一个批处理脚本并返回一个已排序的输出.问题出在最后一栏,数字.10和.11应该在.3之后.我需要"最新版本"在底部,在这种情况下是3.6.7.11
在Linux中,我使用了"sort -t"." - k1n,1 -k2n,2 -k3n,3 -k4n,4"但我无法使用批处理脚本.
此外,由于某些原因,我不允许使用Cygwin或PowerShell.
在我的批处理代码中,我到目前为止只尝试了各种版本,但没有什么对我有用:
sort /+n versions.txt
Run Code Online (Sandbox Code Playgroud)
这个问题中使用的输出很简单
sort versions.txt
Run Code Online (Sandbox Code Playgroud)
看起来命令排序正确,直到我没有使用2位数字.
这是批处理文件中的常见问题.所有排序方法都使用字符串比较,其中"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
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)