Board logo

标题: [文本处理] [已解决]批处理文件如何去除txt中出现重复的行? [打印本页]

作者: batpro    时间: 2012-1-13 20:00     标题: [已解决]批处理文件如何去除txt中出现重复的行?

a.txt中:
  1. zzz
  2. zzz
  3. zzz
  4. fajslkjfsakdj
复制代码
生成 b.txt
  1. fajslkjfsakdj
复制代码

作者: ivor    时间: 2012-1-13 20:15

本帖最后由 ivor 于 2012-1-16 16:56 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.         set count=0
  4.         for /f "skip=1 delims=" %%j in (a.txt) do (
  5.                 if %%i EQU %%j (
  6.                         set /a count+=1
  7.                         
  8.                 )
  9.         
  10.         )
  11.         if NOT !count! GEQ 2 echo %%i>>b.txt
  12. )
复制代码
下面的代码大幅度优化比较的速度,经测试1000行重复字符串,比上个代码快了30倍
  1. @echo off & setlocal enabledelayedexpansion
  2. set Count=0
  3. for /f "delims=" %%i in (a.txt) do (
  4.         
  5.         call :cmp
  6.         if !Count! EQU 1 echo %%i >>b.txt
  7. set Count=0
  8. )
  9. echo.已经成功执行完了 & pause>nul
  10. goto :EOF
  11. :cmp
  12. for /f "skip=1 delims=" %%j in (a.txt) do (
  13.                 if %%i EQU %%j (
  14.                         set /a Count+=1
  15.                         if !Count! EQU 2 goto :EOF
  16.                 )
  17. )
复制代码

作者: batpro    时间: 2012-1-13 21:28

回复 2# ivor


    应验了那句话:“一年逛两次bathome,每次总有新发现”,bat代码真强大!
作者: batpro    时间: 2012-1-13 21:30

回复 2# ivor


    谢谢!
作者: CrLf    时间: 2012-1-14 00:57

回复 2# ivor


这种去除重复行的题目出现过不少次,一般推荐用 set /a ".%%a+=1" + set.|find "=1" (经典)或set %%a=. + if defined (快速)的组合或者用 sort + if %%a==!lastline!(稳妥),速度都比 for 嵌套快很多,推荐搜索一下,必有收获~
作者: ivor    时间: 2012-1-14 02:49

本帖最后由 ivor 于 2012-1-14 02:51 编辑

惭愧,谢谢版主提醒,下次多search
http://bbs.bathome.net/viewthrea ... D%D6%D8%B8%B4%D0%D0
  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.    if not defined "%%a" echo %%a&set ""%%a"=a"
  4. ))>new.txt
复制代码

作者: find    时间: 2012-1-16 09:26

回复 6# ivor


这个代码跟楼主的需求不符吧?
作者: find    时间: 2012-1-16 09:33

回复 2# ivor


pause改成goto :eof是不是更合适?
作者: ivor    时间: 2012-1-16 16:53

回复 9# find


    恩        确实忘了加个退出,已经补上了,谢谢
作者: find    时间: 2012-1-16 19:40

回复 1# batpro
  1. gawk "{a[$0]++}END{for(i in a)if(a[i]==1)print i}" a.txt >b.txt
复制代码

作者: Xyloebll    时间: 2023-5-31 20:47

回复 6# ivor

感谢大佬的代码,成功解决问题




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2