Board logo

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

作者: 881966    时间: 2023-1-22 13:52     标题: [已解决]求助坛友:批处理删除文本重复行,区分字符大小写

本帖最后由 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涔﹀洯
垙寮
作者: 881966    时间: 2023-1-22 14:30

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
复制代码
一样不能区分大小写字符
作者: 77七    时间: 2023-1-22 15:05

  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 完全匹配,试试呢
作者: terse    时间: 2023-1-23 19: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
复制代码

作者: qixiaobin0715    时间: 2023-1-24 10:04

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

作者: aloha20200628    时间: 2023-1-24 16:20

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

一》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处理大数据文件的能限,可请已知者加注...
作者: aloha20200628    时间: 2023-1-24 17:01

补遗》本帖采用 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)
作者: 881966    时间: 2023-2-17 20:27

本帖最后由 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娓告垙寮
作者: 77七    时间: 2023-2-17 21:36

回复 8# 881966

把需要处理的文本 、使用的代码、 使用该代码遇到的问题,分开一一详细描述,不是更好能解决问题?
作者: 77七    时间: 2023-2-17 22:03

本帖最后由 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编码格式,试试吧
作者: fireye    时间: 2023-2-18 10:10

dedup /T xxx.txt >out.txt
dedup工具去第三方下载即可,很方便 。
作者: fireye    时间: 2023-2-18 10:12

gawk64  "a[$0]++" a.txt>b.txt
作者: 881966    时间: 2023-2-18 16:52

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

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

不知道为什么,文本都贴不全
作者: 77七    时间: 2023-2-18 18:19

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

如果还是不行,请把测试失败的样本原件,测试失败生成的样本和批处理原件上传到网盘
作者: 881966    时间: 2023-2-18 18:53

回复 14# 77七


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

谢谢你,麻烦了
作者: 77七    时间: 2023-2-18 19:26

回复 15# 881966

不提供出错信息,又不提供样本,让大家怎么帮你解决问题?你认为的“复制文本”就行,根本不是你想的那样,我既然发出来代码,能测试的我都测试过了,使用正常的
作者: 881966    时间: 2023-2-18 20:02

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

回复 16# 77七


    链接:https://pan.baidu.com/s/1hBw23ogZBNkwqplvrWr60g
提取码:1234

用14楼的代码
作者: 881966    时间: 2023-2-18 20:10

链接:https://pan.baidu.com/s/1W2FliVB36ZhutCqVA56G0g
提取码:1234

这是5楼代码
作者: 881966    时间: 2023-2-18 20:14

链接:https://pan.baidu.com/s/1GMbCqSYFM6KcCXfJQO47Pw
提取码:1234

这是10楼代码
作者: 881966    时间: 2023-2-18 20:20

链接:https://pan.baidu.com/s/1LWaWO1WtfaI9uOSMhprHng
提取码:1234

这是3楼代码
作者: 881966    时间: 2023-2-18 20:28

链接:https://pan.baidu.com/s/1ED_7kc5ASOuj8PLNoo0TaQ
提取码:1234

这是4楼代码
作者: Batcher    时间: 2023-2-18 20:43

回复 13# 881966


如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 881966    时间: 2023-2-18 21:08

回复 22# Batcher


    谢谢管理

今天好像异常,上传百度盘了


麻烦大家了:handshake
作者: 77七    时间: 2023-2-18 22:05

  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.         )
  10.         if not "!str!" equ "" (
  11.                 set n=
  12.                 for /f "delims=" %%c in ("!str!") do (
  13.                         set "str3=%%c"
  14.                 )
  15.                 for /f "delims=" %%b in ('type "b.txt"') do (
  16.                         if "!str3!" equ "%%b" (
  17.                                 set n=1
  18.                         )
  19.                 )
  20.                 if not defined n (
  21.                         >>b.txt echo,!str!
  22.                 )
  23.         )
  24.         endlocal
  25. )
  26. pause
复制代码

水平有限,想不出完美办法,只能折中,使用前手动替换全文中的"!"为其它字符,使用此代码后替换回"!",方可基本解决你的问题。
或者直接使用代码,特殊情况下会出错。
作者: WHY    时间: 2023-2-19 00:17

  1. @if(0)==(0) echo off
  2. cd /d "%~dp0"
  3. type a.txt | cscript //nologo //e:jscript "%~f0" > b.txt
  4. pause & exit
  5. @end
  6. var map = {}
  7. while(!WSH.StdIn.AtEndOfStream){
  8.     var s = WSH.StdIn.ReadLine();
  9.     if(s == ''){
  10.         WSH.Echo(s);
  11.     } else if(!map.hasOwnProperty(s)){
  12.         map[s] = true;
  13.         WSH.Echo(s);
  14.     }
  15. }
复制代码

作者: 881966    时间: 2023-2-19 08:39

回复 24# 77七


    再次感谢 ,让你费心了,
作者: 881966    时间: 2023-2-19 08:40

回复 25# WHY


    谢谢坛友的帮助
作者: terse    时间: 2023-2-19 10:37

  1. @echo off
  2. powershell "$Hash = @{};(GC '.\a.txt').Where({if (!$Hash.Contains($_)){$Hash.Add($_,++$i)}});($Hash.GetEnumerator()| Sort Value).Key"
  3. pause
复制代码





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