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

[文本处理] [已解决]求助坛友:批处理删除文本重复行,区分字符大小写

本帖最后由 881966 于 2023-2-18 17:00 编辑

pfxk&*^wcp
eee?==?fff
eeee#########
h20132052@%
fdsg@$
i-ab.co

ga||game
-u0!JI.h9
""_St.w
//SeM***BW\
g272"|":|":l@785&^&&FG
c")
TheCollector"28hxmf62
7EJbfkctl40UTcbEsD5fyfPSZllW1kAsx7Qp5aN9pnsj2hbSRA4HR1NUVjSd8aYZqUfSkmeVZmR1P4SH07TsRj3LMkgrlC6dphIa4uCeRK8LGNNAwK0SIPVYK2FluEPbUV63GIc3sHS5f93oLumxgn2BRAFZJjz0QH5YbXmSNullvCDosW1aO64GBjyd4iMowzyPfsT3UAVzpo10ruNnWSno9zxoEhQHbBs7FLDIrvRhmbCY7sSaB8VYhyWxCfnuMdHI8r0eXC08BpbKXhRvyFBqk99PXjhKcdVPluCHo9FulP9SLlc9lO1nvzMBkq5oHoiPt5bPESlsT0JlICVzcI964Y2W0F8wP2lsj2vdZj5IA4dpUyJ4JkQEZ
[閾炬帴鐧诲綍鍚庡彲瑙乚
@銆佹彁鐞村瘎
ACG娓告垙寮
垙寮
acg鍜岃皭鍖?
鐪熻悵鑾夛紝鍌插▏鏁戜笘鐣?
e_e鈥樻鐏?
E涔﹀洯
垙寮
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

http://www.bathome.net/thread-28482-1-1.html

代码
  1. @echo off
  2. (for /f "delims=" %%i in (a.txt) do (
  3.     if not defined %%i (
  4.         echo,%%i
  5.         set %%i=1
  6.     )
  7. ))>b.txt
复制代码
一样不能区分大小写字符

TOP

  1. @echo off
  2. cd.>b.txt
  3. for /f "delims=" %%i in (a.txt) do (
  4. findstr /x "%%i" "b.txt">nul||echo %%i>>b.txt
  5. )
  6. pause
复制代码

1楼的代码 加个 /x 完全匹配,试试呢
1

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 terse 于 2023-1-23 22:54 编辑

这样呢
  1. @echo off&setlocal enableDelayedExpansion
  2. (for /f "delims=" %%i in (a.txt) do (
  3.     if not defined _"%%i" (
  4.         echo,%%i
  5.         set _"%%i"=%%i
  6.     ) else if not "!_"%%i"!"  == "%%i"  echo %%i
  7. ))>b.txt
复制代码
没测试
  1. @echo off&setlocal enableDelayedExpansion
  2. (for /f "delims=" %%i in (a.txt) do (
  3.         if not "!_"%%i"!"  == "%%i"  echo %%i
  4.         set _"%%i"=%%i
  5. ))>b.txt
复制代码
1

评分人数

TOP

本帖最后由 qixiaobin0715 于 2023-1-29 14:50 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p str=<1.txt
  4. (for /f "delims=" %%a in ('type 1.txt^|sort') do (
  5.     if not "!str!"=="%%a" (
  6.         echo,!str!
  7.     )
  8.     set str=%%a
  9. )
  10. echo,!str!)>2.txt
  11. pause
复制代码
1

评分人数

TOP

文本行去重是个经典话题,中外论坛老帖多多,但比较精简的批处理版本至少有两个。

一》find版本,上式区分大小写,下式不区分大小写,不保留空行
cd.>out.txt &for /f "delims=" %%s in (in.txt) do (find "%%~s" out.txt>nul||echo,%%s>>out.txt)
cd.>out.txt &for /f "delims=" %%s in (in.txt) do (find /i "%%~s" out.txt>nul||echo,%%s>>out.txt)

二》awk版本,区分大小写,保留空行
awk.exe "!existLines[$0]++" in.txt>out.txt

二者的算法虽然类似,但运行效率有所差别,尤其是对大数据文件(成千上万行+)。
find版的for...in()还会限制每行读入字符量不超过8k。
顺便再重复一下:set/p的单次读入字符量不能超过1k。
至于awk处理大数据文件的能限,可请已知者加注...
1

评分人数

TOP

补遗》本帖采用 findstr 对付无空格数据,匹配参数 /x "%%~s" 即可,若是有空格数据,须用 /xc:"%%~s" 匹配参数式 》
cd.>out.txt &for /f "delims=" %%s in (in.txt) do (findstr /xc:"%%~s" out.txt>nul||echo,%%s>>out.txt)

TOP

本帖最后由 881966 于 2023-2-18 16:18 编辑

现在又发现问题,有特殊字符的文本不能处理,有的汉字处理完了是乱码,空行不能保留,文本行顺序与原先不符,再次求助坛友,谢谢


测试文本上传多次不成功,只能贴出文本敬请坛友测试,本帖的代码都试了,很难描述清楚,谢谢大家:handshake

cpfxk&*^wcp
eee?==?fff
eeee#########
h20132052@%
-u0!JI.h9
fdsg@$
i-ab.co


a||game

""_St.w
//SeM***BW\
g272"|":|":l@785&^&&FG
c")
TheCollector"28hxmf62
7EJbfkctl40UTcbEsD5fyfPSZllW1kAsx7Qp5aN9pnsj2hbSRA4HR1NUVjSd8aYZqUfSkmeVZmR1P4SH07TsRj3LMkgrlC6dphIa4uCeRK8LGNNAwK0SIPVYK2FluEPbUV63GIc3sHS5f93oLumxgn2BRAFZJjz0QH5YbXmSNullvCDosW1aO64GBjyd4iMowzyPfsT3UAVzpo10ruNnWSno9zxoEhQHbBs7FLDIrvRhmbCY7sSaB8VYhyWxCfnuMdHI8r0eXC08BpbKXhRvyFBqk99PXjhKcdVPluCHo9FulP9SLlc9lO1nvzMBkq5oHoiPt5bPESlsT0JlICVzcI964Y2W0F8wP2lsj2vdZj5IA4dpUyJ4JkQEZ

[閾炬帴鐧诲綍鍚庡彲瑙乚
@銆佹彁鐞村瘎
ACG娓告垙寮

TOP

回复 8# 881966

把需要处理的文本 、使用的代码、 使用该代码遇到的问题,分开一一详细描述,不是更好能解决问题?
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2023-2-17 22:06 编辑
  1. @echo off
  2. cd.>b.txt
  3. for /f "delims=" %%i in ('type "a.txt" ^| findstr /n .*') do (
  4.         set "str=%%i"
  5.         setlocal enabledelayedexpansion
  6.         set "str=!str:*:=!"
  7.         if "!str!" equ "" (
  8.                 >>b.txt echo,!str!
  9.         ) else (
  10.                 findstr /x "!str!" "b.txt">nul || (>>b.txt echo,!str!)
  11.         )
  12.         endlocal
  13. )
  14. pause
复制代码

试试这样满足要求吗,如果不行,上传一个样本,再修改。批处理和文本都保存为ansi编码格式,试试吧
1

评分人数

bat小白,请多指教!谢谢!

TOP

dedup /T xxx.txt >out.txt
dedup工具去第三方下载即可,很方便 。

TOP

gawk64  "a[$0]++" a.txt>b.txt
1

评分人数

    • 881966: 最好不用第三方,纯批处理技术 + 1

TOP

本帖最后由 881966 于 2023-2-18 17:02 编辑

测试文本上传多次不成功,只能贴出文本敬请坛友测试,本帖的代码都试了,遇到的问题很难描述清楚,谢谢大家

不知道为什么,文本都贴不全

TOP

  1. @echo off
  2. cd.>b.txt
  3. for /f "delims=" %%i in ('type "a.txt" ^| findstr /n .*') do (
  4.         set "str=%%i"
  5.         setlocal enabledelayedexpansion
  6.         set "str=!str:*:=!"
  7.         if "!str!" equ "" (
  8.                 >>b.txt echo,!str!
  9.         ) else (
  10.                 type "b.txt" | findstr /x "!str!" 1>nul 2>nul || (>>b.txt echo,!str!)
  11.         )
  12.         endlocal
  13. )
  14. pause
复制代码

如果还是不行,请把测试失败的样本原件,测试失败生成的样本和批处理原件上传到网盘
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 14# 77七


    楼上所有的代码都试了,把我贴出的文本复制保存就可以,出错信息很难描述

谢谢你,麻烦了

TOP

返回列表