Windows CLI:按列对文本文件进行排序

Windows CLI:按列对文本文件进行排序

我想使用纯 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 支持的一些其他实用功能。

  • 将嵌入的数字按数字而不是文本进行排序
  • 根据分隔标记而不是固定位置进行排序
  • 仅保留唯一行
  • 限制输出行数

相关内容