Board logo

标题: [文本处理] 批处理如何删除文本中的重复行(重复全删不保留)? [打印本页]

作者: sshlovewp    时间: 2011-8-26 15:54     标题: 批处理如何删除文本中的重复行(重复全删不保留)?

本帖最后由 pcl_test 于 2016-8-16 20:59 编辑

请高手指点,问题如下:
1.txt内容如下:
屋顶花园
屠宰及肉类加工工业
新型肥料
电视节目
有毒植物
中药典彩色图谱
水果、蔬菜、坚果加工工业
神奇的红豆杉
ostrich
西双版纳
电视节目  
中药典彩色图谱  
ostrich

希望用批处理后将重复行删除后保存为2.txt,内容如下:
屋顶花园
屠宰及肉类加工工业
新型肥料
有毒植物
水果、蔬菜、坚果加工工业
神奇的红豆杉
西双版纳
作者: sshlovewp    时间: 2011-8-26 15:57

之前也有类似的贴子,但要求是有重复的行只保留一行,而我要求的是只要有重复的行就删除它,一行也不要。
请高手指点。谢谢!
作者: cjiabing    时间: 2011-8-26 16:00

查找重复行的代码太多了,请搜索论坛,如果有不懂的问题请提问。
作者: sshlovewp    时间: 2011-8-26 16:10

我也在论坛里面查找过,但发现里面的代码只对数字和拼音有效,对汉字没有效果啊。
作者: cjiabing    时间: 2011-8-26 16:27

回复 4# sshlovewp

有这么神奇,竟然对汉字无效?
http://www.bathome.net/search.php?searchid=67&orderby=lastpost&ascdesc=desc&searchsubmit=yes&page=1
作者: sshlovewp    时间: 2011-8-26 16:40

正在看搜索到的帖子,但绝大多数的代码处理汉字时都出错了。
作者: cjiabing    时间: 2011-8-26 16:48

回复 6# sshlovewp


    为什么出错,请具体说明。
作者: sshlovewp    时间: 2011-8-26 16:53

for /f "delims=" %%i in (input.txt) do (
    if not defined %%i set %%i=s & echo %%i>>output.txt)

也不行,所有的帖子我都看过了,绝大多数帖子在举例子时都是用的数字或者字母,真正涉及到汉字时这些代码就不灵了。

换一个说法可能更明白一点,那就是如何提取一个文本中只出现一次的行。
真希望能在以前的帖子中找到前人的解决方法。寻找中。。。。。。
作者: cjiabing    时间: 2011-8-26 17:38

本帖最后由 cjiabing 于 2011-8-26 17:39 编辑

提供一些我收藏的,各种方法都有,自己修改下。
  1. @echo off
  2. cls
  3. echo 过滤文本重复行——把重复的归为一个,其余的删除
  4. echo.
  5. set /p wb=文本1
  6. set /p wb1=文本2
  7. for /f "delims=" %%i in (%wb%) do (
  8. if not defined %%i set %%i=A & echo %%i>>%wb1%
  9. )
  10. echo 处理完成
  11. ping /n 2 127.0.1 >nul
  12. goto :eof
复制代码

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 提取文本重复行——只要重复的部分,不重复的不要
  4. echo.
  5. set /p wb=请输入要处理的[路径]文本:
  6. set /p wb1=请输入处理后生成的[路径]文本:
  7. for /f "delims=" %%a in ('sort %wb%') do (
  8. if %%a equ !b! echo %%a>>%wb1%
  9. set b=%%a)
  10. echo 处理完成
  11. ping /n 2 127.0.1 >nul
  12. goto :eof
复制代码

  1. @echo off
  2. cls
  3. echo 比较文本提取重复行
  4. echo,
  5. echo (如有:1.txt 2.txt 提取1.txt在2.txt里出现的行)
  6. echo.
  7. set /p wb1=请输入要处理的[路径]文本1:
  8. set /p wb2=请输入要处理的[路径]文本2:
  9. set /p wb3=请输入处理后生成的[路径]文本:
  10. for /f "delims=" %%c in (%wb1%) do (
  11. findstr "%%c" %wb2%>nul &&echo %%c>>%wb3%)
  12. echo 处理完成
  13. ping /n 2 127.0.1 >nul
  14. goto :eof
复制代码
  1. @echo off
  2. cls
  3. echo.
  4. echo.
  5. echo                            比较文本提取不重复
  6. echo,
  7. echo        如有:1.txt 2.txt,提取2.txt在1.txt里没有的行
  8. echo        文本2.txt应当比1.txt多一些内容。
  9. echo        重复的不要
  10. echo.
  11. set /p wb1=请输入要处理的[路径]文本2:
  12. set /p wb2=请输入要处理的[路径]文本1:
  13. set /p wb3=请输入处理后生成的[路径]文本:
  14. for /f "delims=" %%c in (%wb1%) do (
  15. findstr "%%c" %wb2%>nul ||echo %%c>>%wb3%)
  16. echo 处理完成
  17. ping /n 2 127.0.1 >nul
  18. goto :eof
复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo 提取文本重复行——只要重复的部分,不重复的不要
  4. echo.
  5. set /p wb=请输入要处理的[路径]文本:
  6. set /p wb1=请输入处理后生成的[路径]文本:
  7. for /f "delims=" %%a in ('sort %wb%') do (
  8. if not %%a equ !b! echo %%a>>%wb1%
  9. set b=%%a)
  10. echo 处理完成
  11. ping /n 2 127.0.1 >nul
  12. goto :eof
复制代码

作者: ArdentMan    时间: 2011-8-26 21:40

本帖最后由 ArdentMan 于 2011-8-26 22:23 编辑

不知道楼主如何搜索的~~~
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. (For /F "delims=" %%i In ('Sort 1.txt^&Echo end') Do (
  3.   If "!Str!" NEQ "%%i" (
  4.     For %%j In ("!Str!") Do If "!%%~j!" EQU "a" Echo,!Str!
  5.   )
  6.   Set "Str=%%i"
  7.   If Not Defined !Str! (
  8.     Set "!Str!=a"
  9.     ) Else (
  10.     Set "!Str!=b"
  11.   )
  12. ))>2.txt
  13. Start 2.txt
复制代码
ps:请注意你的测试文本中有很多空格导致肉眼看到很多重复内容没删除
作者: lvsehuaxue    时间: 2011-8-27 00:43

  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set /a .%%i+=1
  4. )
  5. (for /f "tokens=1,2 delims=.=" %%i in ('set.') do (
  6.     if %%j geq 2 echo %%i
  7. ))>$
  8. (findstr /i /v /g:$ 1.txt)>$$
  9. move $$ 1.txt
  10. del /q $
  11. pause
复制代码

作者: CUer    时间: 2011-8-27 09:06

回复 6# sshlovewp


绝大多数?比如说包括哪些呢?
作者: sshlovewp    时间: 2011-8-30 10:23

不好意思,周末没上网,对以上各位lz的热情帮助表示最诚挚的感谢!
9楼的第三个代码果然有效。太感谢了!
下面的代码还没有来得及实验,因为实在是太兴奋了。
谢谢你们!
作者: sshlovewp    时间: 2011-8-30 11:28

因该是9楼的第四个代码,该代码功能超强,它能将1.txt和2.txt两个文本文档中重复的内容单独提取出来并存为temp.txt(实际上并不会生成temp.txt,为了不让大家混淆)。然后在1.txt中查找,如果1.txt中有和temp.txt重复的内容就删除,最后生成的文件可以单独保存为3.txt。所有这些都是一气呵成的。我做了一点改动,供有这方面需要的朋友参考:
@echo off
for /f "delims=" %%c in (1.txt) do (
findstr "%%c" 2.txt>nul ||echo %%c>>3.txt)
start 3.txt
作者: sshlovewp    时间: 2011-8-30 11:45

这个代码功能超强还体现在,需要比较的两个文本里面的内容既可以是汉字,也可以是字母、数字等。
的确是太给力了!
作者: sshlovewp    时间: 2011-8-30 11:50

findstr /vg:1.txt 2.txt>>3.txt
findstr /xg:1.txt 2.txt>3.txt
(findstr /xvg:1.txt 2.txt
      findstr /xvg:2.txt 1.txt)>3.txt

@echo off
      for /f "delims=" %%a in (1.txt 2.txt) do (
      if defined @%%a (echo>>重复.txt %%a) else echo>>不重复.txt;%%a
      set @%%a=.
      )
      pause



@echo off&setlocal enabledelayedexpansion
      for /f "delims=" %%a in ('"type 1.txt 2.txt 2>nul|sort"') do (
      if %%a==!last! (
      echo>>重复.txt !repeat!
      ) else (
      echo>>不重复.txt %%a
      set last=%%a
      )
      )
      pause

@echo off
      sort 1.txt>1.$
      sort 2.txt>2.$
      fc 1.$ 2.$
      pause

@echo off&setlocal enabledelayedexpansion
      set $=$
      for /f "delims=" %%a in (1.txt 2.txt) do (
      if "!$%%a=!"=="!$!" (echo>>不重复.txt %%a) else echo>>重复.txt %%a
      set $=!$!$%%a
      )
      pause

等等,对文字处理都会出错。
作者: garyng    时间: 2011-8-30 13:39

本帖最后由 garyng 于 2011-8-30 13:40 编辑

请把代码放进code标签括起来!
请参考:如何用code标签把批处理代码括起来
作者: cjiabing    时间: 2011-8-30 19:46

sshlovewp ,请注意将你的代码用[code]括起来!~
另外,那些代码似乎都不是我写的,可能有修改,忘记作者是谁了,以前收藏的。
我觉得批处理也像艺术品一样,有好的代码,功能好、技术好等,都应该收藏起来,有的以备学习、借鉴和欣赏。
作者: pcl_test    时间: 2016-11-10 20:39

  1. powershell -c "$a=New-Object System.Collections.Specialized.OrderedDictionary;gc '文本.txt'|%%{$t=$_.trim();if(!$a[$t]){$a.Add($t,1)}else{$a[$t]+=1}};foreach($b in $a.Keys){if($a[$b] -eq 1){$b}}"
  2. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2