标题: [文本处理] 批处理如何根据一个文本列出的字符串/关键字删除另一文本中含有该字符串/关键字的行? [打印本页]
作者: 我来了 时间: 2016-9-10 09:51 标题: 批处理如何根据一个文本列出的字符串/关键字删除另一文本中含有该字符串/关键字的行?
本帖最后由 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
贴子,好像很贴题,但还是没有自己搞定,所以来求助了。看来基础还没有学好。
作者: wskwfkbdn 时间: 2016-9-10 10:08
findstr /i "^http.*html$"
findstr /i /v "百度 com$"
作者: DiamondbacK 时间: 2016-9-10 12:45
显然先处理 2 再处理 1 效率更高。
作者: 我来了 时间: 2016-9-10 16:13
回复 2# wskwfkbdn
亲,关键字,不能指定!【但可指定 不要的关键字.txt】
作者: 我来了 时间: 2016-9-10 17:39
下面是我托我们qq群好友 昏睡墨鱼(8876570)
搞的ahk版本:
贴出来 大家学习下- #NoEnv
- #SingleInstance force
- #Persistent
-
- FileEncoding , UTF-8
- INIFile := A_ScriptDir "\littleT.ini"
- SetWorkingDir, %A_ScriptDir%
-
- Hotkey, IfWinActive, ahk_exe explorer.exe
- ;~ 在资源管理器当前目录下生成随机 T_xxxx.txt文件,xx范围0-65535
- Hotkey, ^F3, RandomTxt
- ;~ 使用一个文件中的关键词列表(单列)批量逐行过滤文本文件,删除含关键词的行,并保存到后缀为_filted的文件中
- Hotkey, ^F4, FilterTxt
- Hotkey, IfWinActive
-
- return
-
- FilterTxt:
- tarPath := getExplorerPath()
- SetWorkingDir, %thePath%
- IniRead, ffile, %INIFile%, Save, FilterFile, %A_Space%
- ffile = %ffile%
- if (!ffile || !FileExist(ffile))
- ffile =
- SplitPath, ffile, , srcPath
- loop ; 选择过滤文件
- {
- while (!ffile)
- {
- MsgBox, 52, 选择过滤文件, 选择用于过滤的文件
- IfMsgBox, No
- goto, break_FilterTxt
- FileSelectFile, ffile, 1, %srcPath%, 请选择用于过滤的文件, 文本文件 (*.txt)
- }
-
- MsgBox, 582, 确认过滤文件, 用于过滤的文件为`n`n%ffile%`n`n请确认
- IfMsgBox, Cancel
- goto break_FilterTxt
- IfMsgBox, TryAgain
- ffile =
- } until ffile
- IniWrite, %ffile%, %INIFile%, Save, FilterFile
- loop ; 选择被过滤文件
- {
- loop
- {
- FileSelectFile, Filelist, M1, %tarPath%, 请选择要被过滤的文件, 文本文件 (*.txt)
- if (!Filelist)
- MsgBox, 52, 退出, 未要被过滤的文件`n是否退出
- IfMsgBox, Yes
- goto break_FilterTxt
- } until Filelist
- FilesbeFilte := {}
- files_ =
- loop, Parse, Filelist, `n, `r
- {
- if (A_Index=1)
- {
- FPath := A_LoopField
- files_ := FPath "`n下的"
- } else {
- nowFile := FPath "\" A_LoopField
- if (nowFile = ffile)
- {
- MsgBox, 48, 跳过文件, 文件`n`n%nowFile%`n`n是用于过滤的文件`n已跳过
- } else {
- if (RegExMatch(nowFile, "_filted"))
- continue
- FilesbeFilte.Push(nowFile)
- files_ := files_ "`n" A_LoopField
- }
- }
- }
- MsgBox, 582, 确认被过滤文件, 被过滤的文件为`n路径`n`n%files_%`n`n请确认
- ;~ sbox(ffile, FilesbeFilte)
- IfMsgBox, Cancel
- goto break_FilterTxt
- IfMsgBox, TryAgain
- files_ =
- } until files_
- SetWorkingDir, %FPath%
- for k, srcFile in FilesbeFilte
- {
- SplitPath, srcFile, , OutDir, OutExtension, OutNameNoExt
- tarFile := OutDir "\" OutNameNoExt "_filted." OutExtension
- FileDelete %tarFile%
- repLine := {}
- loop, Read, %srcFile% , %tarFile%
- {
- ;~ sbox(A_LoopReadLine, ffile)
- nLine := filterLine(A_LoopReadLine, ffile)
- ;~ 添加有内容并还未存在的行
- if (nLine && !repLine[nLine])
- FileAppend, % nLine "`n"
- repLine[nLine] := true
- }
- }
- break_FilterTxt:
- ffile=
- Filelist=
- FilesbeFilte=
- files_=
- FPath=
- nowFile=
- return
-
- filterLine(line="", file="")
- {
- if (!line || !file)
- return
- loop, Read, %file%
- {
- if !A_LoopReadLine
- return
- if RegExMatch(line, A_LoopReadLine)
- return
- }
- return, line
- }
-
- RandomTxt:
- thePath := getExplorerPath()
- Random, nfeed, 0, 65535
- FileAppend, , %thePath%\T_%nfeed%.txt
- return
-
- getExplorerPath(num=1)
- {
- WinGet, ActiveControlList, ControlList, A
- CList := "ComboBoxEx321|Edit1|ToolbarWindow323"
- loop, Parse, CList, `|
- {
- ControlGetText, OutputVar , %A_LoopField%, A
- if RegExMatch(OutputVar, "\b([A-Z]:\\.*)", Var)
- break
- }
- return Var1
- }
复制代码
作者: wskwfkbdn 时间: 2016-9-10 18:44
简单到我已经没有热情回答问题了
作者: idos 时间: 2016-9-10 19:18
回复 6# wskwfkbdn
低调低调,新手很多,耐心
作者: idos 时间: 2016-9-10 21:13
- @echo off
- ::删除重复行
- for /f %%i in (1.txt) do (
- if not defined _%%i (
- echo %%i
- set _%%i=%%i
- )
- ) >>c.txt
- cd.>1.txt
- >>1.txt findstr /v /g:3.txt c.txt
- del c.txt
- pause
复制代码
其中,1.txt代表原始文件,3.txt是要删除1.txt的列表项目文件,产生一个临时文件c.txt,最后的结果在原始文件里显示
作者: Batcher 时间: 2016-9-10 21:29
- @echo off
- powershell -c "Get-Content '要处理的.txt' | Sort-Object -Unique" > "要处理的_去重.txt"
- findstr /v /g:"不需要出现的关键字.txt" "要处理的_去重.txt" > "要处理的_结果.txt"
复制代码
作者: Batcher 时间: 2016-9-10 22:39
回复 6# wskwfkbdn
把你去重的方案贴出来大家互相学习一下吧
作者: pcl_test 时间: 2016-9-10 22:40
本帖最后由 pcl_test 于 2016-9-11 11:56 编辑
- #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
- #*&cls&gawk -f "%~f0"&pause&exit
-
- BEGIN{
- #如果指定完整路径需把路径中的\改成\\
- filtertxt="关键词.txt"; #指定过滤关键词列表文件
- srctxt="文本.txt"; #指定需处理的源文件
-
- if(match(srctxt,/^(.+\\)([^\\]+)$/,f)){fpath=f[1];fname=f[2]}
- result=!fpath?"filter_"srctxt:fpath"filter_"fname;
- while(getline<filtertxt>0){n++;filter[n]=$0}
- while(getline<srctxt>0){
- if($0~/^[\x20-\x7e]+$/){
- t=0;
- for(i=1;i<=length(filter);i++){
- if(index($0, filter[i])>0){t=1;break}
- }
- if(t==0&&!arr[$0]){print $0>result;arr[$0]=1}
- }else print $0>result;
- }
- }
复制代码
作者: wskwfkbdn 时间: 2016-9-11 07:23
本帖最后由 wskwfkbdn 于 2016-9-11 07:38 编辑
if not defined 判断变量是否定义 可以用于处理重复行、- @echo off
- pushd %~dp0
- echo.jjdd1 23456>a.txt
- echo.jjdd1 23456>>a.txt
- echo.jjdd123457>>a.txt
- for /f "delims=" %%i in (a.txt) do (if not defined %%i set %%i=A & echo %%i)
- pause
复制代码
其它的都好办,与其过滤排除其它文本不如匹配出想要的内容,楼主非要往这个思路上走,我这就保留回答啦
提醒下楼主,最好把与处理的文本发出来,对你的问题解决是有很大的帮助的,如果只限于你的思路去做的话 ,是会找不到更合适的方法的。
作者: 我来了 时间: 2016-9-11 09:37
回复 12# wskwfkbdn
列表关键字每日增加更新中,这点不确定
作者: wskwfkbdn 时间: 2016-9-11 11:54
回复 13# 我来了
该说的我都说了,自己看着办吧,擅用repdos第三方匹配想要的内容,别老是说不懂不懂,正则没什么难的。
作者: Batcher 时间: 2016-9-11 18:11
回复 12# wskwfkbdn
if not defined 这种方案缺点较大,不能处理大文本,不能兼容特殊字符。楼主使用的时候需要特别小心。
作者: wskwfkbdn 时间: 2016-9-11 18:13
回复 15# Batcher
我从来不用这个处理文本,深知批处理处理文本比较弱,已经开发了一个处理文本的命令行程序。谢谢提醒
作者: Batcher 时间: 2016-9-11 18:24
回复 16# wskwfkbdn
主要是想说明一下这不是一个“简单到我已经没有热情回答问题了”
作者: wskwfkbdn 时间: 2016-9-11 19:13
你没有发现已经修改了帖子吗?
但依然对我来说很简单
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |