[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样统计文本中重复行所在的行号?

统计文本文件中重复行的批处理,统计重复内容所在行号。
感觉方法有点乱,但没想出更好的处理方法了。
  1. ::---------以下代码用于生成测试文本---------
  2. @echo off
  3. del testFileName.txt>nul 2>nul
  4. echo 正在生成测试文本!
  5. for /l %%a in (1,1,100) do (
  6. >>testFileName.txt call echo %%random:~,2%%
  7. )
  8. cls
  9. ::---------以上代码用于生成测试文本---------
  10. @ECHO OFF
  11. SETLOCAL ENABLEDELAYEDEXPANSION
  12. mode con: cols=45 lines=4
  13. title CodeBy 0428_hai CMD@XP 2011-04-26
  14. set fileName=testFileName.txt
  15. del temp>nul 2>nul
  16. del temp.txt>nul 2>nul
  17. del result.txt>nul 2>nul
  18. if not exist "%fileName%" set sec=0 & goto :end
  19. for /f "delims=" %%a in (%fileName%) do (
  20. set /a sn+=1
  21. >>temp echo !sn! %%a
  22. )
  23. copy temp _%fileName%>nul
  24. call :times %time:~,-3% sec_Start
  25. :main
  26. if not exist temp goto :end
  27. for /f "tokens=1* delims= " %%a in (temp) do (
  28. call :count !sn!
  29. set sn=
  30. for /f "skip=1 tokens=1* delims= " %%A in (temp) do (
  31. cls
  32. echo 大约还需要进行 !count! 次运算!
  33. echo 当前时间:!time!
  34. call :times !time:~,-3! sec_Cur
  35. set /a sec=!sec_Cur!-!sec_Start!
  36. echo 已用时间:!sec! 秒
  37. set /a count-=1
  38. if "%%b" == "%%B" (
  39. set var=!var!%%A
  40. ) else (
  41. >>temp.txt echo %%A %%B
  42. set /a sn+=1
  43. )
  44. )
  45. cls
  46. if defined var >>result.txt echo 第 %%a !var!行出现了%%b!
  47. set var=
  48. del temp>nul 2>nul
  49. ren temp.txt temp>nul 2>nul
  50. goto :main
  51. )
  52. :end
  53. if exist result.txt (
  54. echo 操作已完成,查询结果保存在result.txt文件中!
  55. start "" result.txt
  56. ) else (
  57. echo 在文件中没有查到重复行!
  58. )
  59. echo 使用时间:!sec! 秒!
  60. pause>nul
  61. exit
  62. :count
  63. set /a count=%1-1
  64. set /a count=%1*%count%/2
  65. goto :eof
  66. :times
  67. for /f "tokens=1,2,3 delims=:" %%a in ("%1") do (
  68. set /a sec=1%%c%%100
  69. set /a min=1%%b%%100
  70. set /a %2=%%a*3600+!min!*60+!sec!
  71. )
  72. goto :eof
复制代码

方法多个 善用搜索 定有收获

TOP

100行无重复数据用时39秒,平均速度约127次/秒。

TOP

没有万能的代码,所有的批处理都是根据其使用条件和要求而设计的。
以楼主的问题,如果行数不多,且无敏感字符问题,直接使用 if defined
如果行数稍多,可以考虑使用 findstr
还有其他很多方法......
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off
  2. for /f "tokens=1,2 delims=:" %%a in ('findstr /n .* a.txt') do (
  3.      if not defined "_%%b" (
  4.        set ""_%%b"=a"
  5.         ) else (
  6.        echo %%a
  7.      )
  8. )
  9. pause>nul
复制代码
***共同提高***

TOP

@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

感觉程序实现过于简单了
文本重复行至少应该分组显示
否则如何确定哪些行与哪些行重复?
天的白色影子

TOP

6# qzwqzw
这是根据楼主的要求来的,具体问题具体代码嘛,呵呵。。。。
***共同提高***

TOP

本帖最后由 zm900612 于 2011-4-27 12:56 编辑

正在尝试解决出题区的“大文件排除重复行”这题,阶段性成果如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (y1.txt) do (
  3. set /a "n=(10000001+n)-(n/10000000)*10000000"
  4. echo !n:~-7!:%%a
  5. ))>1.tmp
  6. sort /rec 8198 /+8 1.tmp>2.tmp
  7. (for /f "tokens=1* delims=:" %%a in (2.tmp) do (
  8. if "%%b" neq "!l!" (set "l=%%b") else echo %%a
  9. ))>3.tmp
复制代码
正好与楼主所说的相符合

TOP

返回列表