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

[文本处理] [已解决]批处理如何删掉前面出现过的字所在行?

本帖最后由 每天几分 于 2022-11-7 12:59 编辑

有1个txt文件,全是词语,要实现每个字只能出现1次,后面如果出现前面出现过的,则删掉后面这行。

如:
一个
这个
但是
自己
就是
但我
还是
我们
自我
这不
很多
……
实现如下:
一个
但是
自己
很多
  1. 就是说前面出了“一个”所以后面带“一……”、“……一”、“……个”、“个……”的行都删掉。
  2. 同样,前面出了“这是”,后面带“这……”“……这”“是……”“……是”的行都删掉。
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

(gawk.exe 的下载地址见 9 楼)
方案一:按楼主的需求以输入文件去重出结果
  1. gawk "{ID=1;for(i=0;++i<=length($0);){s=substr($0,i,1);if(!b[s]++)if(a[s]++)ID=0}delete b}ID" 1.txt>2.txt
  2. 结果:
  3. 一个
  4. 但是
  5. 自己
  6. 很多
复制代码
方案二:以输出文件去重出结果(输出结果在不同的行不会出现重复字,本人觉得这个看上去好像更合理)
  1. gawk "{ID=1;for(i=0;++i<=length($0);){s=substr($0,i,1);if(!b[s]++)if(s in a)ID=0}if(ID){for(i=0;++i<=length($0);)a[substr($0,i,1)];print}delete b}" 1.txt>2.txt
  2. 结果:
  3. 一个
  4. 但是
  5. 自己
  6. 我们
  7. 这不
  8. 很多
复制代码

TOP

本帖最后由 qixiaobin0715 于 2022-11-7 08:46 编辑

回复 8# 每天几分
这个与你顶楼的例子好像有差异。
开始没仔细看,被你在顶楼的描述带偏了,5楼代码逻辑上有问题,如果想使用纯批处理代码,可以运行下面代码,因为你没有提供文件样本,无法测试,个人感觉效率上还过得去:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in (1.txt) do (
  4.     set str=%%a
  5.     if not defined _"!str:~,1!" if not defined _"!str:~-1!" (
  6.         echo,%%a
  7.         set _"!str:~,1!"=true
  8.         set _"!str:~-1!"=true
  9.     )
  10. ))>out.txt
  11. pause
复制代码
1

评分人数

TOP

本帖最后由 WHY 于 2022-11-8 11:13 编辑
  1. $srcFile = '1.txt';
  2. $dstFile = '2.txt';
  3. $Hash    = @{};
  4. $out     = [Collections.ArrayList]@();
  5. forEach( $str In [IO.File]::ReadAllLines($srcFile, [Text.Encoding]::Default) ){
  6.     $flag = $True;
  7.     for( $i=0; $i -lt $str.Length; $i++ ){
  8.         if( $Hash.Contains($str[$i]) ){ $flag = $False; break; }
  9.     }
  10.     if( $flag ){
  11.         $null = $out.Add($str);
  12.         for( $i=0; $i -lt $str.Length; $i++ ){
  13.             if( !$Hash.Contains($str[$i]) ){ $Hash.Add( $str[$i], $True ); }
  14.         }
  15.     }
  16. }
  17. [IO.File]::WriteAllLines($dstFile, $out, [Text.Encoding]::Default);
  18. echo 'Done';
  19. [Console]::ReadLine();
复制代码

TOP

假设原文件为1.txt,编码格式为ANSI,去重用gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),效率也是杠杠的:
  1. gawk "{ID=1;for(i=0;++i<=length($0);){if(a[substr($0,i,1)]++){ID=0}}if(ID)print}" 1.txt>2.txt
复制代码

TOP

回复 7# qixiaobin0715

一个
这个
这是
是的

只要

一个
这是

因为前面出了“一个”所以后面带“一……”、“……一”、“……个”、“个……”的行都删掉。
同样,前面出了“这是”,后面带“这……”“……这”“是……”“……是”的行都删掉。

TOP

本帖最后由 qixiaobin0715 于 2022-11-6 10:47 编辑

还是要好好想想,逻辑上好像有点问题,比如:
  1. 一个
  2. 这个
  3. 这是
复制代码
是只要第一行,还是第一行和第三行都要。复杂了!!!
这种呢:
  1. 一个
  2. 这个
  3. 这是
  4. 是的
复制代码

TOP

回复 4# 每天几分


    慢是必然的,一行一行去对比的,每一行都把字拆散,效率就不是我能力范围了

TOP

如果每行只有2个字,这个应当勉强可用,想要更高效率还是期待大佬吧:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "delims=" %%a in (1.txt) do (
  4.     set str=%%a
  5.     echo,!str:~,1! !str:~-1!
  6. ))>temp.log
  7. (for /f "tokens=1*" %%i in (temp.log) do (
  8.     if not defined _%%i if not defined _%%j echo,%%i%%j
  9.     set /a _%%i=_%%j=1
  10. ))>out.txt
  11. del temp.log
  12. pause
复制代码
1

评分人数

TOP

效率有点慢,词语一多就慢了,6000个就用了10分钟以上。
有200多万词啊

TOP

回复 2# pd1


   
算出现过,不好意思,是我打错了,你的第二个批处理可解决。

TOP

”我们“的“我”在上面有个”但我“
这个不算出现过了吗
如果不算出现过了  那么“这不”也应该在结果中吧。

文本保存在1.txt里。上面说的两种情况用以下两种代码。保存为.bat文件
另外现在win10和win11 新建的文本都是utf8格式的,就用了默认的
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=@()
  7. $b=@()
  8. gc -Encoding UTF8 .\1.txt |%{if((Compare-Object $b $_.ToCharArray() -PassThru -IncludeEqual -ExcludeDifferent).length -eq 0){$a+=$_;$_.ToCharArray()|%{$b+=$_}}}
  9. $a
复制代码
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=@()
  7. $b=@()
  8. gc -Encoding UTF8 .\1.txt |%{if((Compare-Object $b $_.ToCharArray() -PassThru -IncludeEqual -ExcludeDifferent).length -eq 0){$a+=$_;$_.ToCharArray()|%{$b+=$_}}else{$_.ToCharArray()|%{$b+=$_}}}
  9. $a
复制代码
1

评分人数

TOP

返回列表