标题: [文本处理] 批处理怎样统计文本中重复行所在的行号? [打印本页]
作者: 0428_hai 时间: 2011-4-26 17:07 标题: 批处理怎样统计文本中重复行所在的行号?
统计文本文件中重复行的批处理,统计重复内容所在行号。
感觉方法有点乱,但没想出更好的处理方法了。- ::---------以下代码用于生成测试文本---------
- @echo off
- del testFileName.txt>nul 2>nul
- echo 正在生成测试文本!
- for /l %%a in (1,1,100) do (
- >>testFileName.txt call echo %%random:~,2%%
- )
- cls
- ::---------以上代码用于生成测试文本---------
-
- @ECHO OFF
- SETLOCAL ENABLEDELAYEDEXPANSION
- mode con: cols=45 lines=4
- title CodeBy 0428_hai CMD@XP 2011-04-26
- set fileName=testFileName.txt
- del temp>nul 2>nul
- del temp.txt>nul 2>nul
- del result.txt>nul 2>nul
- if not exist "%fileName%" set sec=0 & goto :end
-
- for /f "delims=" %%a in (%fileName%) do (
- set /a sn+=1
- >>temp echo !sn! %%a
- )
- copy temp _%fileName%>nul
- call :times %time:~,-3% sec_Start
-
- :main
- if not exist temp goto :end
- for /f "tokens=1* delims= " %%a in (temp) do (
- call :count !sn!
- set sn=
- for /f "skip=1 tokens=1* delims= " %%A in (temp) do (
- cls
- echo 大约还需要进行 !count! 次运算!
- echo 当前时间:!time!
- call :times !time:~,-3! sec_Cur
- set /a sec=!sec_Cur!-!sec_Start!
- echo 已用时间:!sec! 秒
- set /a count-=1
- if "%%b" == "%%B" (
- set var=!var!%%A
- ) else (
- >>temp.txt echo %%A %%B
- set /a sn+=1
- )
- )
- cls
- if defined var >>result.txt echo 第 %%a !var!行出现了%%b!
- set var=
- del temp>nul 2>nul
- ren temp.txt temp>nul 2>nul
- goto :main
- )
-
- :end
- if exist result.txt (
- echo 操作已完成,查询结果保存在result.txt文件中!
- start "" result.txt
- ) else (
- echo 在文件中没有查到重复行!
- )
- echo 使用时间:!sec! 秒!
- pause>nul
- exit
-
- :count
- set /a count=%1-1
- set /a count=%1*%count%/2
- goto :eof
-
- :times
- for /f "tokens=1,2,3 delims=:" %%a in ("%1") do (
- set /a sec=1%%c%%100
- set /a min=1%%b%%100
- set /a %2=%%a*3600+!min!*60+!sec!
- )
- goto :eof
复制代码
作者: terse 时间: 2011-4-26 17:33
方法多个 善用搜索 定有收获
作者: 0428_hai 时间: 2011-4-26 18:22
100行无重复数据用时39秒,平均速度约127次/秒。
作者: hanyeguxing 时间: 2011-4-26 18:26
没有万能的代码,所有的批处理都是根据其使用条件和要求而设计的。
以楼主的问题,如果行数不多,且无敏感字符问题,直接使用 if defined
如果行数稍多,可以考虑使用 findstr
还有其他很多方法......
作者: batman 时间: 2011-4-27 01:36
- @echo off
- for /f "tokens=1,2 delims=:" %%a in ('findstr /n .* a.txt') do (
- if not defined "_%%b" (
- set ""_%%b"=a"
- ) else (
- echo %%a
- )
- )
- pause>nul
复制代码
作者: qzwqzw 时间: 2011-4-27 11:30
@echo off
for /f "tokens=1,2 delims=:" %%a in ('findstr /n .* a.txt') do (
if not defined "_%%b" (
set ""_%%b"=a"
) else (
echo %%a
)
)
pause>nul
batman 发表于 2011-4-27 01:36
感觉程序实现过于简单了
文本重复行至少应该分组显示
否则如何确定哪些行与哪些行重复?
作者: batman 时间: 2011-4-27 12:28
6# qzwqzw
这是根据楼主的要求来的,具体问题具体代码嘛,呵呵。。。。
作者: CrLf 时间: 2011-4-27 12:55
本帖最后由 zm900612 于 2011-4-27 12:56 编辑
正在尝试解决出题区的“大文件排除重复行”这题,阶段性成果如下:- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%a in (y1.txt) do (
- set /a "n=(10000001+n)-(n/10000000)*10000000"
- echo !n:~-7!:%%a
- ))>1.tmp
- sort /rec 8198 /+8 1.tmp>2.tmp
- (for /f "tokens=1* delims=:" %%a in (2.tmp) do (
- if "%%b" neq "!l!" (set "l=%%b") else echo %%a
- ))>3.tmp
复制代码
正好与楼主所说的相符合
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |