我想使用纯 Windows CLI 命令按第 3 列数据(而不是第 3 个字符)对文本文件进行排序。这些命令将放入批处理文件中。
数据看起来就像
#filename seqno phasename a b c scale Rwp
blah_001.xye 1 corundum 3 3 12 0.001 3
blah_001.xye 1 silicon 5.4 5.4 5.4 0.002 3
blah_002.xye 2 corundum 3.1 3.1 12.1 0.002 3.5
blah_002.xye 2 silicon 5.41 5.41 5.41 0.004 3.5
blah_003.xye 3 corundum 3.2 3.2 12.2 0.001 3.1
blah_003.xye 3 silicon 5.42 5.42 5.42 0.002 3.1
blah_004.xye 4 corundum 3.4 3.4 12.2 0.001 3.2
blah_004.xye 4 silicon 5.43 5.43 5.43 0.002 3.2
blah_005.xye 5 corundum 3.5 3.5 12.3 0.001 3.9
blah_005.xye 5 silicon 5.44 5.44 5.44 0.002 3.9
blah_006.xye 6 corundum 3.6 3.6 12.3 0.001 3.1
blah_006.xye 6 silicon 5.45 5.45 5.45 0.002 3.1
我想按阶段名称排序。如果我能保留第一行就好了。第 3 列之后会有超过 5 列,并且会有比这更多的行,但排序始终按第 3 列进行。
我见过这个问题,但我无法解密命令。
答案1
您的文件使用固定宽度格式,因此您总是希望从位置 21 开始排序。
该SORT
命令提供了一个选项,可以从行中的特定位置开始执行每行比较。唯一的缺点是它没有提供将标题记录保持在顶部的机制。
因此,诀窍是使用SET /P
读取第一行并将其写入新文件。然后使用MORE +1
读取除第一行之外的所有内容,并将其通过管道传输到SORT \+21
新文件并将结果附加到新文件。最后要做的是用 的新文件覆盖原始文件MOVE
。
@echo off
setlocal enableDelayedExpansion
set "file=test.txt"
set /p "ln=" < "%file%"
>"%file%.new" (
echo(!ln!
more +1 "%file%" | sort /+21
)
move /y "%file%.new" "%file%" >nul
此策略有局限性:
- 如果文件超过 64k 行,MORE 将挂起
- MORE 将制表符转换为空格
- 由于 SET /P 限制,标题行不得超过 1021 个字符。
或者你可以使用我的JSORT.BAT 实用程序用一个简单的命令轻松高效地执行排序。仍然需要 MOVE。
@echo off
call test.txt /p 21 /s 1 /o test.txt.new
move /y test.txt.new test.txt >nul
JSORT 是纯脚本(混合 JScript/批处理),可在 XP 及以上版本的任何 Windows 机器上本地运行。无需第三方 exe 文件。
请注意,与内置的 SORT 命令不同,JSORT 默认为区分大小写的搜索。示例文本没有问题,但如果您想忽略大小写,则只需附加该/I
选项即可。
JSORT 有大小限制,因为整个文件必须适合内存中的单个字符串变量。我不确定确切的值,但我相信支持的最大文件大小略小于 1GB。
阅读内置帮助来了解 JSORT 支持的一些其他实用功能。
- 将嵌入的数字按数字而不是文本进行排序
- 根据分隔标记而不是固定位置进行排序
- 仅保留唯一行
- 限制输出行数