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

[文本处理] 批处理如何删除文本中的重复行(重复全删不保留)?

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

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

希望用批处理后将重复行删除后保存为2.txt,内容如下:
屋顶花园
屠宰及肉类加工工业
新型肥料
有毒植物
水果、蔬菜、坚果加工工业
神奇的红豆杉
西双版纳
一切从头开始

  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
复制代码

TOP

sshlovewp ,请注意将你的代码用[code]括起来!~
另外,那些代码似乎都不是我写的,可能有修改,忘记作者是谁了,以前收藏的。
我觉得批处理也像艺术品一样,有好的代码,功能好、技术好等,都应该收藏起来,有的以备学习、借鉴和欣赏。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

请把代码放进code标签括起来!
请参考:如何用code标签把批处理代码括起来

TOP

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

等等,对文字处理都会出错。
一切从头开始

TOP

这个代码功能超强还体现在,需要比较的两个文本里面的内容既可以是汉字,也可以是字母、数字等。
的确是太给力了!
一切从头开始

TOP

因该是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
一切从头开始

TOP

不好意思,周末没上网,对以上各位lz的热情帮助表示最诚挚的感谢!
9楼的第三个代码果然有效。太感谢了!
下面的代码还没有来得及实验,因为实在是太兴奋了。
谢谢你们!
一切从头开始

TOP

回复 6# sshlovewp


绝大多数?比如说包括哪些呢?

TOP

  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
复制代码

TOP

本帖最后由 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:请注意你的测试文本中有很多空格导致肉眼看到很多重复内容没删除
一路飘过的鸟~~~

TOP

本帖最后由 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
复制代码
1

评分人数

寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

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

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

换一个说法可能更明白一点,那就是如何提取一个文本中只出现一次的行。
真希望能在以前的帖子中找到前人的解决方法。寻找中。。。。。。
一切从头开始

TOP

回复 6# sshlovewp


    为什么出错,请具体说明。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

正在看搜索到的帖子,但绝大多数的代码处理汉字时都出错了。
一切从头开始

TOP

返回列表