批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

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

求助坛友:批处理删除文本重复行,区分字符大小写,谢谢

123
334
dfg
123
cfgy
5678
bhg
123
12345
12345678
12345
12345678
asdfg
asdfg
ASD
ASD
asd
asDfg

处理后

123
334
dfg
cfgy
5678
bhg
12345
12345678
asdfg
ASD
asd
asDfg

代码
  1. @echo off
  2. set /p=<nul>2.txt
  3. for /f "delims=" %%i in (1.txt) do (
  4. findstr "%%i" "2.txt">nul||echo %%i>>2.txt
  5. )
  6. pause
复制代码
不能区分大小写字符

祝坛友们2023万事如意
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

返回列表