批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[文本处理] bat 处理文本另类去重??

bat  处理文本另类去重??

文本1.txt
111
222
====
111
111
222
222
333
333
444
444
555
666


去重后 生成文本2.txt
111
222
====
111
222
333
333
444
444
555
666

本帖最后由 qixiaobin0715 于 2022-11-21 09:28 编辑

实际上也不算另类,bat文件和1.txt文件均另存为ANSI编码:
  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     echo,%%a
  4.     set /a n+=1
  5.     if "%%a"=="====" goto :a
  6. ))>2.txt
  7. :a
  8. setlocal enabledelayedexpansion
  9. (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
  10.     if not "!str!"=="%%i" echo,%%i
  11.     set str=%%i
  12. ))>>2.txt
  13. pause
复制代码

TOP

回复 1# idc878787
想简单了,因为有goto语句,标签放在括号内会出问题。
已修改。

TOP

回复 3# qixiaobin0715
刚才我也试了,闪退...我怀疑我错了...
不过大神好像有点理解偏差,是对====上方存在的,去重下方的
bat小白,请多指教!谢谢!

TOP

  1. 111
  2. 222
  3. ====
  4. 111
  5. 111
  6. 222
  7. 222
  8. 333
  9. 333
  10. 444
  11. 444
  12. 555
  13. 666
复制代码
以ANSI编码格式保存为1.txt
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe
执行
  1. gawk "NR==1,/====/{a[$0]=1;print;next}{if($0 in a){if(a[$0]){print;a[$0]=0}next}}1" 1.txt>2.txt
复制代码
结果(2.txt)
  1. 111
  2. 222
  3. ====
  4. 111
  5. 222
  6. 333
  7. 333
  8. 444
  9. 444
  10. 555
  11. 666
复制代码

TOP

回复 4# 77七
修改后的应当可以,你可以再试试。
我这里测试没问题

TOP

回复 6# qixiaobin0715
代码正常运行了,结果不对,====上方有的,就不去重了,大神再仔细看看..
bat小白,请多指教!谢谢!

TOP

回复 7# 77七
测试过程:
  1. C:\Users\Administrator\Desktop>type 1.txt
  2. 111
  3. 222
  4. ====
  5. 111
  6. 111
  7. 222
  8. 222
  9. 333
  10. 333
  11. 444
  12. 444
  13. 555
  14. 666
  15. C:\Users\Administrator\Desktop>type test2.bat
  16. @echo off
  17. (for /f "delims=" %%a in (1.txt) do (
  18.     echo,%%a
  19.     set /a n+=1
  20.     if "%%a"=="====" goto :a
  21. ))>2.txt
  22. :a
  23. setlocal enabledelayedexpansion
  24. (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
  25.     if not "!str!"=="%%i" echo,%%i
  26.     set str=%%i
  27. ))>>2.txt
  28. pause
  29. C:\Users\Administrator\Desktop>test2.bat
  30. 请按任意键继续. . .
  31. C:\Users\Administrator\Desktop>type 2.txt
  32. 111
  33. 222
  34. ====
  35. 111
  36. 222
  37. 333
  38. 444
  39. 555
  40. 666
  41. C:\Users\Administrator\Desktop>
复制代码

TOP

本帖最后由 77七 于 2022-11-21 10:28 编辑

回复 8# qixiaobin0715
111
222
====
111
222
333
333

444
444

555
666
楼主的结果...和你的不一样的..
bat小白,请多指教!谢谢!

TOP

回复 9# 77七
想当然了,确实如此。

TOP

本帖最后由 qixiaobin0715 于 2022-11-21 11:14 编辑

回复 9# 77七

这样呢:
  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     echo,%%a
  4.     set _"%%a"=true
  5.     set /a n+=1
  6.     if "%%a"=="====" goto :a
  7. ))>2.txt
  8. :a
  9. setlocal enabledelayedexpansion
  10. (for /f "skip=%n% delims=" %%i in ('type 1.txt^|sort') do (
  11.     if not defined _"%%i" (
  12.         echo,%%i
  13.     ) else (
  14.         if not "!str!"=="%%i" echo,%%i
  15.     )
  16.     set str=%%i
  17. ))>>2.txt
  18. pause
复制代码

TOP

本帖最后由 qixiaobin0715 于 2022-11-21 11:40 编辑

只是存在一个致命的问题,2楼11楼代码运行去重生成的新文件,分割线下面的文本行会重新排序。
如果不介意顺序重排问题,可以使用11楼代码。

TOP

回复 12# qixiaobin0715
可以了,我运行11楼代码顺序也是对的
bat小白,请多指教!谢谢!

TOP

回复 13# 77七
那是因为楼主提供的样本是按正序排列的。巧合!!!

TOP

如果要保持文本行原有顺序,可以这样:
  1. @echo off
  2. (for /f "delims=" %%a in (1.txt) do (
  3.     echo,%%a
  4.     set _"%%a"=true
  5.     set /a n+=1
  6.     if "%%a"=="====" goto :a
  7. ))>2.txt
  8. :a
  9. setlocal enabledelayedexpansion
  10. (for /f "skip=%n% delims=" %%i in ('type 1.txt') do (
  11.     if not defined _"%%i" (
  12.         echo,%%i
  13.     ) else (
  14.         if "!_"%%i"!"=="true" (
  15.             echo,%%i
  16.             set _"%%i"==false
  17.         )
  18.     )
  19. ))>>2.txt
  20. pause
复制代码

TOP

返回列表