@ECHO OFF
SETLOCAL enabledelayedexpansion
:: Temporary filename
:tloop
SET "temppfx=%temp%\%random%"
IF EXIST "%temppfx%*" GOTO tloop
:: Hold that tempfile name...
ECHO.>"%temppfx%_"
:: a long string of spaces note the end-of-string quote -----here--v
SET "spaces= "
SET /a count=0
(
FOR /f "tokens=1,3 delims=|" %%a IN (fscif.txt) DO (
SET /a count+=1
SET "field1=%%a%spaces%"
SET "field3=%%b%spaces%"
SET "fieldc=%spaces%!count!"
ECHO(!field1:~0,10!!field3:~0,12!^|!fieldc:~-8!^|!count!^|%%a^|%%b
)
)>"%temppfx%1"
:: Now report
SET "key=x"
SET /a count=0
(
FOR /f "tokens=1,3* delims=|" %%a IN ('sort "%temppfx%1" ') DO (
IF "!key!"=="%%a" (
SET "line=!line! %%b"
SET /a count+=1
) ELSE (IF !count! neq 0 CALL :output
SET key=%%a
SET line=%%b
SET "data=%%c"
SET /a count=1
)
)
CALL :output
)>report.txt
del "%temppfx%*"
GOTO :eof
:output
ECHO(!data!;%count% times;line nos %line: = ^& %
GOTO :eof
正如我之前解释的那样,有数百万条记录,您可能会用完环境空间。如上所述,我认为您可能仍然会用完,因为行号报告可能很大 - 不知道 - 您熟悉您的真实数据。
本质上,首先要做的是建立一个临时文件。
从输入文件中所需的标记开始——我遵循了 1 和 3,但毫无疑问可能还有更多——只要跟着弹跳球…
所选字段被填充 - 右侧用于文本字段,左侧用于使用spaces变量的计数字段。
然后生成临时文件输出。我随机选择了第一个字段的最大长度为 10,第二个字段的最大长度为 12。这两者结合起来给出了key场。前导填充的计数字段作为第二列输出,因此在SORTing 之后,数据将按 key 分组,然后是行号。然后复制剩余的感兴趣的列。
然后将数据排序为下一个for/f循环的输入 - 只有标记 1(键)、3(原始行号)和“其余”(没有填充的键)是感兴趣的
然后,只需计算匹配键并累积行号line并在键更改时报告。需要最后一个输出来报告最后一个数据项,我们就完成了。