Windows Batch FOR循环改进

时间:2017-03-03 09:04:30

标签: batch-file

我有一个批处理检查TXT文件中的重复行(超过一百万行),13MB,运行时间超过2小时...我怎样才能加快速度?谢谢!!

TXT文件

11
22
33
44
.
.
.
44 (over one million line)

现有批次

setlocal
set var1=*
sort original.txt>sort.txt
for /f %%a in ('type sort.txt') do (call :run %%a)
goto :end
:run
if %1==%var1% echo %1>>duplicate.txt
set var1=%1
goto :eof
:end

4 个答案:

答案 0 :(得分:2)

这应该是使用批处理文件的最快方法:

@echo off
setlocal EnableDelayedExpansion

set var1=*
sort original.txt>sort.txt
(for /f %%a in (sort.txt) do (
   if "%%a" == "!var1!" (
      echo %%a
   ) else (
      set "var1=%%a"
   )
)) >duplicate.txt

答案 1 :(得分:2)

此方法使用findstr命令,如aschipfl的答案,但在这种情况下,每个行及其副本在被findstr修改后从文件中删除。如果文件中的重复数量很高,则此方法可以更快;否则它会变慢,因为每一轮都会操纵高音量数据。只是一个测试可以证实这一点......

@echo off
setlocal EnableDelayedExpansion

del duplicate.txt 2>NUL
copy /Y original.txt input.txt > NUL

:nextTurn
for %%a in (input.txt) do if %%~Za equ 0 goto end

< input.txt (
   set /P "line="
   findstr /X /C:"!line!"
   find /V "!line!" > output.txt
) >> duplicate.txt

move /Y output.txt input.txt > NUL
goto nextTurn

:end

答案 2 :(得分:0)

@echo off
setlocal enabledelayedexpansion
set var1=*
(
for /f %%a in ('sort q42574625.txt') do (
 if "%%a"=="!var1!" echo %%a
 set "var1=%%a"
)
)>"u:\q42574625_2.txt"

GOTO :EOF

这可能会更快 - 我没有你的文件来测试

我使用了一个名为q42574625.txt的文件,其中包含一些虚拟数据供我测试。

目前尚不清楚您是否只想要一个重复行的实例。如果源文件中有6条相同的行,您的代码将生成5个“重复”行。

这是一个只报告每个重复行一次的版本:

@echo off
setlocal enabledelayedexpansion
set var1=*
set var2=*
(
for /f %%a in ('sort q42574625.txt') do (
 if "%%a"=="!var1!" IF "!var2!" neq "%%a" echo %%a&SET "var2=%%a"
 set "var1=%%a"
)
)>"u:\q42574625.txt"

GOTO :EOF

答案 3 :(得分:0)

假设您提供文本文件作为第一个命令行参数,您可以尝试以下操作:

@echo off
for /F "usebackq delims=" %%L in ("%~1") do (
    for /F "delims=" %%K in ('
        findstr /X /C:"%%L" "%~1" ^| find /C /V ""
    ') do (
        if %%K GTR 1 echo %%L
    )
)

这将返回所有重复的行,但每次都返回多次,即每次都出现在文件中。