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

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

[复制链接]
发表于 2009-2-27 19:07:32 | 显示全部楼层 |阅读模式
本帖最后由 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 编辑 ]
发表于 2009-2-27 19:33:23 | 显示全部楼层
本代码可适用于多次重复的情况
  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 编辑 ]
 楼主| 发表于 2009-2-27 19:38:25 | 显示全部楼层

回复 2楼 的帖子

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

把 echo *改成echo *>>b.txt
 楼主| 发表于 2009-2-27 19:47:09 | 显示全部楼层

回复 4楼 的帖子

有三个  echo  我不知改哪个
能不能来个全的
发表于 2009-2-27 19:53:41 | 显示全部楼层
除了@echo off中的echo,都改为echo *>>tmp.txt
发表于 2009-2-27 20:02:34 | 显示全部楼层
Re: batman兄
一个  set/a "_%%a+=1 就够了哦
 楼主| 发表于 2009-2-27 20:09:46 | 显示全部楼层
处理几十行没问题,我这上万行的文件一开bat 就没反映了,有什么好的办法,我电脑配置也不低,3G内存
发表于 2009-2-27 20:11:37 | 显示全部楼层

回复 8楼 的帖子

建议在顶楼更新帖子,说明需要处理“万行的文件”,以便他人针对你的具体情况给出合适的方案。
发表于 2009-2-27 20:26:19 | 显示全部楼层
原帖由 terse 于 2009-2-27 20:02 发表
Re: batman兄
一个  set/a "_%%a+=1 就够了哦

兄所言即是,已修改,写代码时未及细作,惭愧。。。。
 楼主| 发表于 2009-2-27 20:31:24 | 显示全部楼层

回复 10楼 的帖子

那么新的代码是什么呢
发表于 2009-2-27 23:03:29 | 显示全部楼层
  思路:先用sort把文本排序,这样,重复的行就前后相连,然后,用for来读取文本,判断上下句是否一致即可。
发表于 2009-2-28 00:16:08 | 显示全部楼层
  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 . . .
发表于 2009-2-28 00:37:47 | 显示全部楼层
假设要处理的文件为a.txt 运行前备份
  1. 啊  有了啊  竟然一致
复制代码

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

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

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢提醒

查看全部评分

发表于 2009-2-28 10:40:06 | 显示全部楼层

回复 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 03:50 , Processed in 0.036821 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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