找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34025|回复: 11

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

[复制链接]
发表于 2012-1-13 20:00:53 | 显示全部楼层 |阅读模式
a.txt中:
  1. zzz
  2. zzz
  3. zzz
  4. fajslkjfsakdj
复制代码
生成 b.txt

  1. fajslkjfsakdj
复制代码

评分

参与人数 1PB +2 收起 理由
CrLf + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-1-13 20:15:35 | 显示全部楼层
本帖最后由 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.                        
  18. )

  19.                
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-1-13 21:28:17 | 显示全部楼层
回复 2# ivor


    应验了那句话:“一年逛两次bathome,每次总有新发现”,bat代码真强大!
 楼主| 发表于 2012-1-13 21:30:00 | 显示全部楼层
回复 2# ivor


    谢谢!
发表于 2012-1-14 00:57:07 | 显示全部楼层
回复 2# ivor


这种去除重复行的题目出现过不少次,一般推荐用 set /a ".%%a+=1" + set.|find "=1" (经典)或set %%a=. + if defined (快速)的组合或者用 sort + if %%a==!lastline!(稳妥),速度都比 for 嵌套快很多,推荐搜索一下,必有收获~
发表于 2012-1-14 02:49:01 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2012-1-16 09:26:37 | 显示全部楼层
回复 6# ivor


这个代码跟楼主的需求不符吧?
发表于 2012-1-16 09:33:04 | 显示全部楼层
回复 2# ivor


pause改成goto :eof是不是更合适?
发表于 2012-1-16 16:53:38 | 显示全部楼层
回复 9# find


    恩        确实忘了加个退出,已经补上了,谢谢
发表于 2012-1-16 19:40:03 | 显示全部楼层
回复 1# batpro
  1. gawk "{a[$0]++}END{for(i in a)if(a[i]==1)print i}" a.txt >b.txt
复制代码
发表于 2023-5-31 20:47:15 | 显示全部楼层
回复 6# ivor

感谢大佬的代码,成功解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:27 , Processed in 0.021634 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表