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

[文本处理] 批处理如何将txt文本里的所有重复行排到文本前端?

本帖最后由 pcl_test 于 2016-9-6 19:47 编辑

txt 文本排版批处理求救(上万行的)
例如文本内容是:
1111
2222
3333
3333
4444
5555
4444


我想把重复的文本排在所有文本的前面,得到新的文本文件如下(不用做排序,乱的就行,只要在前面):
3333
3333
4444
4444
1111
2222
5555

求教,感激不尽万行

[ 本帖最后由 a4620269 于 2009-2-27 20:13 编辑 ]

本代码可适用于多次重复的情况
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do set /a _%%a+=1
  3. for /f "delims=_=" %%a in ('set _') do (
  4.     if !_%%a! neq 1 (
  5.        for /l %%b in (1,1,!_%%a!) do echo %%a
  6.        ) else (
  7.        set /a n+=1&set "_!n!=%%a"
  8.     )
  9. )
  10. for /l %%a in (1,1,!n!) do echo !_%%a!
  11. pause>nul
复制代码

[ 本帖最后由 batman 于 2009-2-27 20:25 编辑 ]
***共同提高***

TOP

回复 2楼 的帖子

太厉害了,但是我得不到bat 里的文本,怎么办

TOP

原帖由 a4620269 于 2009-2-27 19:38 发表
太厉害了,但是我得不到bat 里的文本,怎么办

把 echo *改成echo *>>b.txt
***共同提高***

TOP

回复 4楼 的帖子

有三个  echo  我不知改哪个
能不能来个全的

TOP

除了@echo off中的echo,都改为echo *>>tmp.txt

TOP

Re: batman兄
一个  set/a "_%%a+=1 就够了哦

TOP

处理几十行没问题,我这上万行的文件一开bat 就没反映了,有什么好的办法,我电脑配置也不低,3G内存

TOP

回复 8楼 的帖子

建议在顶楼更新帖子,说明需要处理“万行的文件”,以便他人针对你的具体情况给出合适的方案。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 terse 于 2009-2-27 20:02 发表
Re: batman兄
一个  set/a "_%%a+=1 就够了哦

兄所言即是,已修改,写代码时未及细作,惭愧。。。。
***共同提高***

TOP

回复 10楼 的帖子

那么新的代码是什么呢

TOP

  思路:先用sort把文本排序,这样,重复的行就前后相连,然后,用for来读取文本,判断上下句是否一致即可。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  1. @echo off
  2. echo 一万行文本的测试结果
  3. echo 开始时间%time%
  4. sort a.txt>b.txt
  5. (for /f "delims=" %%a in (b.txt) do (
  6.   if not defined %%a (
  7.     set "%%a=1"
  8.   ) else (
  9.     echo.%%a
  10.   )
  11. ))>c.txt
  12. findstr /x /g:c.txt a.txt>d.txt
  13. findstr /x /v /g:c.txt a.txt>>d.txt
  14. echo 结束时间%time%
  15. pause
复制代码
一万行文本的测试结果
开始时间 0:16:46.42
结束时间 0:16:55.21
Press any key to continue . . .
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

假设要处理的文件为a.txt 运行前备份
  1. 啊  有了啊  竟然一致
复制代码

另:
是否加个判断c.txt的生成呢 空就跳过FINDSTR 不然报错

[ 本帖最后由 terse 于 2009-2-28 00:47 编辑 ]
1

评分人数

TOP

回复 14楼 的帖子

感谢提醒。
没有重复行的时候,c.txt依然会生成,只不过为空而已。
干脆屏蔽算了。
  1. @echo off
  2. echo 一万行文本的测试结果
  3. echo 开始时间%time%
  4. sort a.txt>b.txt
  5. (for /f "delims=" %%a in (b.txt) do (
  6.   if not defined %%a (
  7.     set "%%a=1"
  8.   ) else (
  9.     echo.%%a
  10.   )
  11. ))>c.txt
  12. findstr /x /g:c.txt a.txt>d.txt 2>nul
  13. findstr /x /v /g:c.txt a.txt>>d.txt 2>nul
  14. echo 结束时间%time%
  15. pause
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表