找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 57075|回复: 27

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

[复制链接]
发表于 2023-1-22 13:52:14 | 显示全部楼层 |阅读模式
本帖最后由 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涔﹀洯
垙寮

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

 楼主| 发表于 2023-1-22 14:30:01 | 显示全部楼层
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
复制代码
一样不能区分大小写字符
发表于 2023-1-22 15:05:58 | 显示全部楼层
  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技术 +1 收起 理由
881966 + 1 谢谢指教

查看全部评分

发表于 2023-1-23 19:57:57 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
881966 + 1 谢谢帮助

查看全部评分

发表于 2023-1-24 10:04:27 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

发表于 2023-1-24 16:20:54 | 显示全部楼层
文本行去重是个经典话题,中外论坛老帖多多,但比较精简的批处理版本至少有两个。

一》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技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

发表于 2023-1-24 17:01:44 | 显示全部楼层
补遗》本帖采用 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)
 楼主| 发表于 2023-2-17 20:27:22 | 显示全部楼层
本帖最后由 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娓告垙寮
发表于 2023-2-17 21:36:33 | 显示全部楼层
回复 8# 881966

把需要处理的文本 、使用的代码、 使用该代码遇到的问题,分开一一详细描述,不是更好能解决问题?
发表于 2023-2-17 22:03:54 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

发表于 2023-2-18 10:10:45 | 显示全部楼层
dedup /T xxx.txt >out.txt
dedup工具去第三方下载即可,很方便 。
发表于 2023-2-18 10:12:00 | 显示全部楼层
gawk64  "a[$0]++" a.txt>b.txt

评分

参与人数 1技术 +1 收起 理由
881966 + 1 最好不用第三方,纯批处理

查看全部评分

 楼主| 发表于 2023-2-18 16:52:56 | 显示全部楼层
本帖最后由 881966 于 2023-2-18 17:02 编辑

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

不知道为什么,文本都贴不全
发表于 2023-2-18 18:19:30 | 显示全部楼层
  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技术 +1 收起 理由
881966 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-2-18 18:53:51 | 显示全部楼层
回复 14# 77七


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

谢谢你,麻烦了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 05:09 , Processed in 0.026769 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表