标题: [文本处理] 【已解决】批处理如何在每行文字中,提取重复内容? [打印本页]
作者: 每天几分 时间: 2022-9-30 19:36 标题: 【已解决】批处理如何在每行文字中,提取重复内容?
本帖最后由 每天几分 于 2022-10-3 16:21 编辑
有一个txt文本,每行大概5-30字,N行。
能否把每行文字中,与后面重复出现的文字提取出来到一个新的txt中呢?谢谢!
单字不提取,只提取5个字的重复。
例如:
人生本就充满了矛盾
任何人都无可奈何
仿佛地狱中的火焰
常与寂寞为伍
拿他都无可奈何
跟他充满了矛盾
不得不与寂寞为伍
这段旅途实在太长
……
提取:
充满了矛盾
都无可奈何
与寂寞为伍
……
作者: yhcfsr 时间: 2022-9-30 23:16
POWERSHELL- $len_str = 5 #重复字符串长度
- $file = '.\0.txt' #文件
-
- #====================================
- $dic = @{}
- $ErrorActionPreference = 'SilentlyContinue';
- gc |%{
- $len = $_.Length;
- if($len -lt $len_str){continue;}
- for($i = 0;$i -lt $len-$len_str+1;$i++){
- $key = $_.Substring($i,$len_str)
- $dic.Add( $key,0)
- if($? -eq $false){$dic[$key] +=1}
- }
- }
- foreach($key in $dic.Keys){
- $cnt = $dic.Item($key)
- if($cnt){$key+":重复$cnt 次"}
- }
复制代码
作者: 每天几分 时间: 2022-9-30 23:51
回复 2# yhcfsr
你好,我不太会ps,只懂一点bat。我运行后 出现如下- 位于命令管道位置 1 的 cmdlet Get-Content
- 请为以下参数提供值:
- Path[0]:
复制代码
作者: WHY 时间: 2022-10-2 17:24
- @if(0)==(0) echo off
- type 1.txt | cscript //nologo //e:jscript "%~f0" > new.txt
- pause & exit /b
- @end
-
- var len = 5, map = {};
- while( !WSH.StdIn.AtEndOfStream ){
- var str = WSH.StdIn.ReadLine();
- for( var i = 0; i < str.length - len + 1; i++ ){
- var key = str.substr(i, len);
- map[key] = map.hasOwnProperty(key) ? map[key] + 1 : 1;
- }
- }
- for( key in map ) if( map[key] > 1 ) WSH.Echo(key);
复制代码
作者: aloha20200628 时间: 2022-10-4 17:30
给一段纯P代码,本想用js再优化一步其中的字符串长度计算代码,但实测结果,后者比前者竟然慢了...
纯P代码中的字符串长度计算算法源引自一个被认为P史以来非常经典的案例(参见 http://www.bathome.net/thread-4482-1-1.html)
以下代码均假设源文本文件与代码脚本在同一目录
一。纯P方案- @echo off
- set srcF="a.txt" &set newF="a.new"
- set/a "m=0","fsL=5" &::设置重复字段长度
- setlocal enabledelayedexpansion
- (for /f "usebackq delims=" %%s in (%srcF%) do (
- set "s=%%s" &(call :strLen s sL)
- set/a "n=!sL!-%fsL%","m+=1"
- for /L %%k in (0,1,!n!) do (
- set "sk=!s:~%%k,%fsL%!"
- (more +!m! %srcF%|findstr /i /c:"!sk!")>nul&&echo,!sk!
- )
- ))>%newF%
- endlocal&exit/b
-
- :strLen // %1为被测字符串变量名 %2为返回值变量名
- ( set "str=a!%~1!"
- set "len=0"
- for /l %%a in (12,-1,0) do (
- set/a "len|=1<<%%a"
- for %%b in (!len!) do if "!str:~%%b,1!"=="" set/a "len&=~1<<%%a"
- )
- )
- if "%~2" neq "" set/a "%~2=!len!"
- exit /b
复制代码
二。P+js混编方案- @set @v=1 /*
- @echo off
- set srcF="a.txt" &set newF="a.new"
- set/a "m=0","fsL=5" &::设置重复字段长度
- setlocal enabledelayedexpansion
- (for /f "usebackq delims=" %%s in (%srcF%) do (
- for /f "delims=" %%v in ('cscript /e:jscript "%~f0" "%%~s" ') do set "sL=%%v"
- set "s=%%s" &set/a "n=!sL!-%fsL%","m+=1"
- for /L %%k in (0,1,!n!) do (
- set "sk=!s:~%%k,%fsL%!"
- (more +!m! %srcF%|findstr /i /c:"!sk!")>nul&&echo,!sk!
- )
- ))>%newF%
- endlocal&exit/b
- */
- v=WSH.Arguments; //获取命令行参数
- WSH.Echo(v(0).length); //计算字符串长度
复制代码
作者: WHY 时间: 2022-10-14 23:19
回复 5# aloha20200628
如果把 cscript 放到 for 循环体内部,每循环一次都要启动一个CMD 子进程,再调用一次 cscript
cscript本身执行命令的速度并不慢,但频繁启动 CMD 子进程、调用外部命令会花费很多时间,从而拖慢整个 bat 的执行时间。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |