我有一个批处理检查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
答案 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
)
)
这将返回所有重复的行,但每次都返回多次,即每次都出现在文件中。