2021-08-21 cmd 把文本包含关键字的行输出到新文件并去除原先文件含有该关键字的行

1.txt 原字符串文件,把 | & - 之类的特别符号替换成其他东西才能正常运行,这个找机会写一个解决这个问题的bat
1.txt

eritoaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@
bbbbbbb
ccccccc
@echo off
rem 转rtf-8 不然中文会乱码
chcp 65001
set a=0
rem 行数
set b=0
rem 文件大小
:start
for /f "delims=" %%i in ('type 1.txt') do echo %%i | findstr /i erito > tmp & echo %%i >tmp2 & goto second
rem 搜索到关键字erito 的放到tmp 然后把没使用搜索的文本放到tmp2
rem 因为是文本第一行没有忽略行数,避免程序不正常就个别写了这个之后会在second 和 third 循环运行
:second

for /f "delims=" %%i in ("%cd%\tmp") do for /f "delims==" %%j in ('set b') do set b & set b=%%j%%~zi
rem %%~i 是for的特殊param可以分辨文件大小,但有个小麻烦就是当文件为空的时候必须要在变量才能看到
rem 为了把b出成装载文本的变量,我们必须要在for启动这样的步骤 先用for 装载一个 set b,然后再do后面再来个set b ,这两个貌似没有意义其实只有这样才能做后面那句赋值,别问我为什么,我试出来的.最后 set b=里面必须含有for装载的%%j 才能顺利赋值,%%j没有分割的时候是b=0,所以分了=号它就是b 所以是b0

if "%b%"=="b0" ( goto aa ) else goto bb
rem 字符串比较用双引号这个就不用多说了
rem 如果tmp是空的文件代表没搜到该行有关键字,就会继续写入newx文件 否则写入erito.txt
:aa
for /f "delims=" %%i in (tmp2) do echo %%i >>"%cd%\newx.txt" & goto third  
:bb
for /f "delims=" %%i in (tmp) do echo %%i >>erito.txt & goto third

:third
set /a a=%a%+1 
for /f "skip=%a% delims=" %%i in ('type 1.txt') do echo %%i | findstr /i erito > tmp & echo %%i >tmp2 & goto second


:end
rem 把之前含有关键字的行去除后替换最初的文件
del 1.txt
ren newx.txt 1.txt


测试了一下,小的文件其实还好,超过几M的文本量,能等一天,我几分钟就放弃了,因为每次for它都要从第一行一直数下去运行,每次都这样的话到后面只会越来越慢,但如果单纯选取关键字输出没有这个判断环节的话其实也蛮快的,大概几十秒这样子.实验为上…证实翻车…

用python几M的文件是秒的,其实程序还是可以优化一下的


keyword="javascript"
a=[]
b=[]
f=open('C:\\1\\cli_sim_crud\\onetab arrange url\\1.txt','r',encoding='utf-8')
for line in f:
    #找到关键字的行就是-1 ,所以不是-1就是找到咯
    y=line.find("javascript")
    if y != -1:
        a.append(line)
                
    else:
        b.append(line)

f=open('C:\\1\\cli_sim_crud\\onetab arrange url\\javascript.txt','w',encoding='utf-8')
#写入list用writelines
f.writelines(a)
f.close()   
f=open('C:\\1\\cli_sim_crud\\onetab arrange url\\newx.txt','w',encoding='utf-8')
f.writelines(b)
f.close()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值