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

[文本处理] 批处理如何根据一个文本列出的字符串/关键字删除另一文本中含有该字符串/关键字的行?

本帖最后由 pcl_test 于 2016-9-11 21:18 编辑

根据【不需要出现的关键字.txt】内容删除【要处理的.txt】所在的行



1先处理掉【要处理的.txt】中重复行
2.再解决上面提出的第二个条件


不需要出现的关键字.txt

zhidao.baidu.com
baidu
test.com

lansedongli

内容不确定。。。省略其他(PS,中文处理可以暂时忽略掉。)





发现这个
http://www.bathome.net/thread-13831-2-1.html
贴子,好像很贴题,但还是没有自己搞定,所以来求助了。看来基础还没有学好。
1

评分人数

    • pcl_test: 多搜索,多学习,多测试PB -6

findstr /i "^http.*html$"

findstr /i /v "百度 com$"
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

显然先处理 2 再处理 1 效率更高。

TOP

回复 2# wskwfkbdn

亲,关键字,不能指定!【但可指定   不要的关键字.txt】

TOP

下面是我托我们qq群好友 昏睡墨鱼(8876570)

搞的ahk版本:

贴出来 大家学习下
  1. #NoEnv
  2. #SingleInstance force
  3. #Persistent
  4. FileEncoding , UTF-8
  5. INIFile := A_ScriptDir "\littleT.ini"
  6. SetWorkingDir, %A_ScriptDir%
  7. Hotkey, IfWinActive, ahk_exe explorer.exe
  8. ;~ 在资源管理器当前目录下生成随机 T_xxxx.txt文件,xx范围0-65535
  9. Hotkey, ^F3, RandomTxt
  10. ;~ 使用一个文件中的关键词列表(单列)批量逐行过滤文本文件,删除含关键词的行,并保存到后缀为_filted的文件中
  11. Hotkey, ^F4, FilterTxt
  12. Hotkey, IfWinActive
  13. return
  14. FilterTxt:
  15.     tarPath := getExplorerPath()
  16.     SetWorkingDir, %thePath%
  17.     IniRead, ffile, %INIFile%, Save, FilterFile, %A_Space%
  18.     ffile = %ffile%
  19.     if (!ffile || !FileExist(ffile))
  20.         ffile =
  21.     SplitPath, ffile, , srcPath
  22.     loop                    ; 选择过滤文件
  23.     {
  24.         while (!ffile)
  25.         {
  26.             MsgBox, 52, 选择过滤文件, 选择用于过滤的文件
  27.             IfMsgBox, No
  28.                 goto, break_FilterTxt
  29.             FileSelectFile, ffile, 1, %srcPath%, 请选择用于过滤的文件, 文本文件 (*.txt)
  30.         }
  31.         MsgBox, 582, 确认过滤文件, 用于过滤的文件为`n`n%ffile%`n`n请确认
  32.         IfMsgBox, Cancel
  33.             goto break_FilterTxt
  34.         IfMsgBox, TryAgain
  35.             ffile =
  36.     } until ffile
  37.     IniWrite, %ffile%, %INIFile%, Save, FilterFile
  38.     loop                    ; 选择被过滤文件
  39.     {
  40.         loop
  41.         {
  42.             FileSelectFile, Filelist, M1, %tarPath%, 请选择要被过滤的文件, 文本文件 (*.txt)
  43.             if (!Filelist)
  44.                 MsgBox, 52, 退出, 未要被过滤的文件`n是否退出
  45.             IfMsgBox, Yes
  46.                 goto break_FilterTxt
  47.         } until Filelist
  48.         FilesbeFilte := {}
  49.         files_ =
  50.         loop, Parse, Filelist, `n, `r
  51.         {
  52.             if (A_Index=1)
  53.             {
  54.                 FPath := A_LoopField
  55.                 files_ := FPath "`n下的"
  56.             } else {
  57.                 nowFile := FPath "\" A_LoopField
  58.                 if (nowFile = ffile)
  59.                 {
  60.                     MsgBox, 48, 跳过文件, 文件`n`n%nowFile%`n`n是用于过滤的文件`n已跳过
  61.                 } else {
  62.                     if (RegExMatch(nowFile, "_filted"))
  63.                         continue
  64.                     FilesbeFilte.Push(nowFile)
  65.                     files_ := files_ "`n" A_LoopField
  66.                 }
  67.             }
  68.         }
  69.         MsgBox, 582, 确认被过滤文件, 被过滤的文件为`n路径`n`n%files_%`n`n请确认
  70.         ;~ sbox(ffile, FilesbeFilte)
  71.         IfMsgBox, Cancel
  72.             goto break_FilterTxt
  73.         IfMsgBox, TryAgain
  74.             files_ =
  75.     } until files_
  76.     SetWorkingDir, %FPath%
  77.     for k, srcFile in FilesbeFilte
  78.     {
  79.         SplitPath, srcFile, , OutDir, OutExtension, OutNameNoExt
  80.         tarFile := OutDir "\" OutNameNoExt "_filted." OutExtension
  81.         FileDelete %tarFile%
  82.         repLine := {}
  83.         loop, Read, %srcFile% , %tarFile%
  84.         {
  85.             ;~ sbox(A_LoopReadLine, ffile)
  86.             nLine := filterLine(A_LoopReadLine, ffile)
  87.             ;~ 添加有内容并还未存在的行
  88.             if (nLine && !repLine[nLine])
  89.                 FileAppend, % nLine "`n"
  90.             repLine[nLine] := true
  91.         }
  92.     }
  93. break_FilterTxt:
  94.     ffile=
  95.     Filelist=
  96.     FilesbeFilte=
  97.     files_=
  98.     FPath=
  99.     nowFile=
  100. return
  101. filterLine(line="", file="")
  102. {
  103.     if (!line || !file)
  104.         return
  105.     loop, Read, %file%
  106.     {
  107.         if !A_LoopReadLine
  108.             return
  109.         if RegExMatch(line, A_LoopReadLine)
  110.             return
  111.     }
  112.     return, line
  113. }
  114. RandomTxt:
  115.     thePath := getExplorerPath()
  116.     Random, nfeed, 0, 65535
  117.     FileAppend, , %thePath%\T_%nfeed%.txt
  118. return
  119. getExplorerPath(num=1)
  120. {
  121.     WinGet, ActiveControlList, ControlList, A
  122.     CList := "ComboBoxEx321|Edit1|ToolbarWindow323"
  123.     loop, Parse, CList, `|
  124.     {
  125.         ControlGetText, OutputVar , %A_LoopField%, A
  126.         if RegExMatch(OutputVar, "\b([A-Z]:\\.*)", Var)
  127.             break
  128.     }
  129.     return Var1
  130. }
复制代码
1

评分人数

    • CrLf: 标明出处是美德技术 + 1

TOP

简单到我已经没有热情回答问题了
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

回复 6# wskwfkbdn


    低调低调,新手很多,耐心

TOP

  1. @echo off
  2. ::删除重复行
  3. for /f %%i in (1.txt) do (
  4. if not defined _%%i (
  5. echo %%i
  6. set _%%i=%%i
  7. )
  8. ) >>c.txt
  9. cd.>1.txt
  10. >>1.txt findstr /v /g:3.txt c.txt
  11. del c.txt
  12. pause
复制代码
其中,1.txt代表原始文件,3.txt是要删除1.txt的列表项目文件,产生一个临时文件c.txt,最后的结果在原始文件里显示
1

评分人数

TOP

  1. @echo off
  2. powershell -c "Get-Content '要处理的.txt' | Sort-Object -Unique" > "要处理的_去重.txt"
  3. findstr /v /g:"不需要出现的关键字.txt" "要处理的_去重.txt" > "要处理的_结果.txt"
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# wskwfkbdn


    把你去重的方案贴出来大家互相学习一下吧
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 pcl_test 于 2016-9-11 11:56 编辑
  1. #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
  2. #*&cls&gawk -f "%~f0"&pause&exit
  3. BEGIN{
  4.     #如果指定完整路径需把路径中的\改成\\
  5.     filtertxt="关键词.txt";  #指定过滤关键词列表文件
  6.     srctxt="文本.txt";  #指定需处理的源文件
  7.    
  8.     if(match(srctxt,/^(.+\\)([^\\]+)$/,f)){fpath=f[1];fname=f[2]}
  9.     result=!fpath?"filter_"srctxt:fpath"filter_"fname;
  10.     while(getline<filtertxt>0){n++;filter[n]=$0}
  11.     while(getline<srctxt>0){
  12.         if($0~/^[\x20-\x7e]+$/){
  13.             t=0;
  14.             for(i=1;i<=length(filter);i++){
  15.                 if(index($0, filter[i])>0){t=1;break}
  16.             }
  17.             if(t==0&&!arr[$0]){print $0>result;arr[$0]=1}
  18.         }else print $0>result;
  19.     }
  20. }
复制代码
1

评分人数

TOP

本帖最后由 wskwfkbdn 于 2016-9-11 07:38 编辑

if not defined 判断变量是否定义 可以用于处理重复行、
  1. @echo off
  2. pushd %~dp0
  3. echo.jjdd1 23456>a.txt
  4. echo.jjdd1 23456>>a.txt
  5. echo.jjdd123457>>a.txt
  6. for /f "delims=" %%i in (a.txt) do (if not defined %%i set %%i=A & echo %%i)
  7. pause
复制代码
其它的都好办,与其过滤排除其它文本不如匹配出想要的内容,楼主非要往这个思路上走,我这就保留回答啦

提醒下楼主,最好把与处理的文本发出来,对你的问题解决是有很大的帮助的,如果只限于你的思路去做的话 ,是会找不到更合适的方法的。
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

回复 12# wskwfkbdn

列表关键字每日增加更新中,这点不确定

TOP

回复 13# 我来了


    该说的我都说了,自己看着办吧,擅用repdos第三方匹配想要的内容,别老是说不懂不懂,正则没什么难的。
判定一个人是否为伸手党的标准是取决于他的态度和诚意。

TOP

回复 12# wskwfkbdn


    if not defined 这种方案缺点较大,不能处理大文本,不能兼容特殊字符。楼主使用的时候需要特别小心。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表