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

[文本处理] 求助bat脚本提取重复出现2次或2次以上的文本行?

例如文本1.txt
aaa
AAA
bbb
ccc
ccc
ccc
dd
dD
e
f

提取  相同含有2个 或者2个以上的文本行   忽略含有英文的大小写?
生成文本2.txt
aaa
AAA
ccc
ccc
ccc
dd
dD

本帖最后由 xp3000 于 2022-10-12 13:23 编辑
回复  xp3000

   运行中  有时提示“过程试图写入的管道不存在”   直接结束了  是什么原因?
idc878787 发表于 2022-10-12 08:35


改了,第一次那个不支持超大文本,这个支持
  1. @if(0)==(0) echo off&cd %~dp0
  2. title  保存ANSI格式BAT文件,处理ANSI文件
  3. cscript -nologo -e:jscript "%~0" <"文本1.txt" >"文本2.txt"
  4. pause&exit /b
  5. @end
  6. WSH.echo(WSH.StdIn.ReadAll().match(/^(.+)(\r?\n\1){1,}/img).join(''));
复制代码

TOP

回复 2# xp3000


    谢谢

TOP

回复 2# xp3000


   运行中  有时提示“过程试图写入的管道不存在”   直接结束了  是什么原因?

TOP

如果不介意第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),以下指令也很高效
  1. gawk "{if(tolower($0)==tolower(A)){print A;B=1}else{if(B){print A;B=0}}}{A=$0}END{if(B)print A}" test.txt
复制代码

TOP

回复 5# hfxiang


    这个不会用?

TOP

回复 1# idc878787
按照你提供的样本,提取相邻重复行:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (a.txt) do (
  4.     if /i "%%a"=="!str!" (
  5.         echo,!str!
  6.         set n=1
  7.     ) else (
  8.         if !n! equ 1 echo,!str!
  9.         set n=0
  10.     )
  11.     set str=%%a
  12. )
  13. if !n! equ 1 echo,!str!
  14. pause
复制代码
bat文件保存为ANSI编码。

TOP

回复 7# qixiaobin0715


    没有生成新文本?  如果修改 重复出现5次或5次以上的文本行呢

TOP

回复 8# idc878787
不会再来个100次吧。bat处理类似的问题不是强项,最好使用其它脚本处理,勉强可以这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=1
  4. for /f "delims=" %%a in (a.txt) do (
  5.     if /i "%%a"=="!m4!" (
  6.         set /a n+=1
  7.         if !n! equ 5 (
  8.             echo,!m1!
  9.             echo,!m2!
  10.             echo,!m3!
  11.             echo,!m4!
  12.             echo,%%a
  13.         )
  14.         if !n! equ 6 (
  15.             echo,%%a
  16.             set n=5
  17.         )
  18.     ) else (
  19.         set n=1
  20.     )
  21.     set m1=!m2!
  22.     set m2=!m3!
  23.     set m3=!m4!
  24.     set m4=%%a
  25. )
  26. pause
复制代码

TOP

回复 6# idc878787


gawk.exe 下载之后放到 C:\Windows\System32 这个文件夹下
稍微修改5楼代码:
gawk "{if(tolower($0)==tolower(A)){print A;B=1}else{if(B){print A;B=0}}}{A=$0}END{if(B)print A}" 1.txt >2.txt
保存为 test.bat 放到跟你的 1.txt 同一个文件夹下
执行 test.bat
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# idc878787


   
提取连续N(大于等于2的任意整数)行以上相邻重复行,不区分大小写,下例N=5
  1. gawk -vN=5 "{{if(tolower($0)==tolower(A)){a[++i]=A;B=1}else{if(B){if(++i>=N){a[i]=A;for(j=1;j<=i;j++)print a[j]};B=0;i=0}}}{A=$0}}END{if(B){if(++i>=N){a[i]=A;for(j=1;j<=i;j++)print a[j]}}}" 1.txt>2.txt
复制代码

TOP

给一个纯P解法》先用系统自带的sort简化一下本题...
  1. @echo off &setlocal enabledelayedexpansion
  2. set "lastS=" &set n=0
  3. (for /f "delims=" %%s in ('sort 1.txt') do (
  4.    if /i "!lastS!" == "%%~s" (
  5.        if !n! equ 0 echo,!lastS!
  6.        echo,%%s
  7.        set/a n+=1
  8.    ) else set n=0
  9.    set "lastS=%%s"
  10. ))>2.txt
  11. endlocal&exit/b
复制代码

TOP

返回列表