标题: [文本处理] 求助bat脚本提取重复出现2次或2次以上的文本行? [打印本页]
作者: idc878787 时间: 2022-10-11 21:45 标题: 求助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-11 23:09
本帖最后由 xp3000 于 2022-10-12 13:23 编辑
回复 xp3000
运行中 有时提示“过程试图写入的管道不存在” 直接结束了 是什么原因?
idc878787 发表于 2022-10-12 08:35
改了,第一次那个不支持超大文本,这个支持- @if(0)==(0) echo off&cd %~dp0
- title 保存ANSI格式BAT文件,处理ANSI文件
-
- cscript -nologo -e:jscript "%~0" <"文本1.txt" >"文本2.txt"
-
- pause&exit /b
- @end
- WSH.echo(WSH.StdIn.ReadAll().match(/^(.+)(\r?\n\1){1,}/img).join(''));
复制代码
作者: idc878787 时间: 2022-10-12 07:31
回复 2# xp3000
谢谢
作者: idc878787 时间: 2022-10-12 08:35
回复 2# xp3000
运行中 有时提示“过程试图写入的管道不存在” 直接结束了 是什么原因?
作者: hfxiang 时间: 2022-10-12 08:51
如果不介意第3方工具gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),以下指令也很高效- 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
复制代码
作者: idc878787 时间: 2022-10-12 09:59
回复 5# hfxiang
这个不会用?
作者: qixiaobin0715 时间: 2022-10-12 10:01
回复 1# idc878787
按照你提供的样本,提取相邻重复行:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- if /i "%%a"=="!str!" (
- echo,!str!
- set n=1
- ) else (
- if !n! equ 1 echo,!str!
- set n=0
- )
- set str=%%a
- )
- if !n! equ 1 echo,!str!
- pause
复制代码
bat文件保存为ANSI编码。
作者: idc878787 时间: 2022-10-12 10:09
回复 7# qixiaobin0715
没有生成新文本? 如果修改 重复出现5次或5次以上的文本行呢
作者: qixiaobin0715 时间: 2022-10-12 13:14
回复 8# idc878787
不会再来个100次吧。bat处理类似的问题不是强项,最好使用其它脚本处理,勉强可以这样:- @echo off
- setlocal enabledelayedexpansion
- set n=1
- for /f "delims=" %%a in (a.txt) do (
- if /i "%%a"=="!m4!" (
- set /a n+=1
- if !n! equ 5 (
- echo,!m1!
- echo,!m2!
- echo,!m3!
- echo,!m4!
- echo,%%a
- )
- if !n! equ 6 (
- echo,%%a
- set n=5
- )
- ) else (
- set n=1
- )
- set m1=!m2!
- set m2=!m3!
- set m3=!m4!
- set m4=%%a
- )
- pause
复制代码
作者: Batcher 时间: 2022-10-12 13:34
回复 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
作者: hfxiang 时间: 2022-10-12 15:00
回复 8# idc878787
提取连续N(大于等于2的任意整数)行以上相邻重复行,不区分大小写,下例N=5- 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
复制代码
作者: aloha20200628 时间: 2022-10-12 18:23
给一个纯P解法》先用系统自带的sort简化一下本题...- @echo off &setlocal enabledelayedexpansion
- set "lastS=" &set n=0
- (for /f "delims=" %%s in ('sort 1.txt') do (
- if /i "!lastS!" == "%%~s" (
- if !n! equ 0 echo,!lastS!
- echo,%%s
- set/a n+=1
- ) else set n=0
- set "lastS=%%s"
- ))>2.txt
- endlocal&exit/b
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |