返回列表 发帖

[文本处理] 批处理如何将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 编辑 ]

本代码可适用于多次重复的情况
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do set /a _%%a+=1
for /f "delims=_=" %%a in ('set _') do (
    if !_%%a! neq 1 (
       for /l %%b in (1,1,!_%%a!) do echo %%a
       ) else (
       set /a n+=1&set "_!n!=%%a"
    )
)
for /l %%a in (1,1,!n!) do echo !_%%a!
pause>nulCOPY

[ 本帖最后由 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

@echo off
echo 一万行文本的测试结果
echo 开始时间%time%
sort a.txt>b.txt
(for /f "delims=" %%a in (b.txt) do (
  if not defined %%a (
    set "%%a=1"
  ) else (
    echo.%%a
  )
))>c.txt
findstr /x /g:c.txt a.txt>d.txt
findstr /x /v /g:c.txt a.txt>>d.txt
echo 结束时间%time%
pauseCOPY
一万行文本的测试结果
开始时间 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 运行前备份
啊  有了啊  竟然一致COPY

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

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

评分人数

TOP

回复 14楼 的帖子

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

TOP

返回列表