无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5197|回复: 10
打印 上一主题 下一主题

请教个文本文件内容处理的批处理,检测每一行,如果下一行包含它,就删除下一行

  [复制链接]
跳转到指定楼层
1#
发表于 2021-6-17 23:21:43 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
文件a.txt中有很多行
比如
hklm\hklm
hklm\hklm\aa
hklm\hklm\aa\bb
hklm\hhhh
hklm\hhhh\hh
hklm\nssb\xxoo
hklm\nssb\xxoo\ooxx\998
处理后只留下
hklm\hklm
hklm\hhhh
hklm\nssb\xxoo
也就是读取每一行,检测下一行如果包含读取的那行,就删除,不包含则保留



2#
发表于 2021-6-18 12:33:24 | 只看该作者
结果在b.txt里。

@echo off
setlocal enabledelayedexpansion

del /f /q b.txt >nul 2>&1

set PREV_KEY=[]
for /f "tokens=*" %%I in (a.txt) do (
  echo "%%I" | find /i "!PREV_KEY!" >nul

  if !errorlevel! neq 0 (
    echo %%I>>b.txt
    set PREV_KEY=%%I

  ) else (
    echo 已跳过“%%I”
  )
)

点评

几十万行的文本,等了几个小时才执行好了,不过可能我折腾的逻辑还有点问题,漏处理了好几行  详情 回复 发表于 2021-6-19 16:20
回复

使用道具 举报

3#
 楼主| 发表于 2021-6-19 16:20:59 | 只看该作者
hua_wuxin 发表于 2021-6-18 12:33
结果在b.txt里。

@echo off

几十万行的文本,等了几个小时才执行好了,不过可能我折腾的逻辑还有点问题,漏处理了好几行

点评

确实。批处理只适合处理几十到几百行的吧。  详情 回复 发表于 2021-6-19 16:54
回复

使用道具 举报

4#
发表于 2021-6-19 16:54:08 | 只看该作者
江南一根葱 发表于 2021-6-19 16:20
几十万行的文本,等了几个小时才执行好了,不过可能我折腾的逻辑还有点问题,漏处理了好几行

确实。批处理只适合处理几十到几百行的吧。
回复

使用道具 举报

5#
发表于 2021-6-19 20:43:47 | 只看该作者
工具错了啊,支持正则的文本处理软件对付这个才是利器。
回复

使用道具 举报

6#
发表于 2021-11-2 16:11:08 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-11-2 16:38 编辑

用 find 不妥,如果 同时用 两行数据

12345
234123456


那么第二行包含上一行,是否第二行就被删掉了?

回复

使用道具 举报

7#
发表于 2021-11-2 16:22:07 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-11-2 16:37 编辑

几十万行数据,估计要运行一段时间。

回复

使用道具 举报

8#
发表于 2021-11-2 16:37:44 | 只看该作者
还没搞定吗
回复

使用道具 举报

9#
发表于 2021-11-2 16:38:19 | 只看该作者
本帖最后由 黑中见白 于 2021-11-2 17:22 编辑

看起来是Process Monitor的注册表监视数据Powershell 倒序排序,然后下一行比
回复

使用道具 举报

10#
发表于 2021-11-2 17:00:35 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-11-2 17:05 编辑

有这种情况么?
1/2
1/2/3/4/5


一定是下一行的长度大于上一行的长度么?
我想可以通过赋值和 比长度的方法解决。如果不存在上面我说的跳级别的情况 也可以通过赋值和取变量目录的方法解决。


回复

使用道具 举报

11#
发表于 2021-11-2 21:42:18 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-11-2 22:04 编辑

如下代码,把str1.txt 简化生成为 str2.txt
算法,把文件第一行赋值给变量并计算长度,然后进行第二行,如果第二行前面指定长度的内容与上面那个赋值一样,就跳过,反之重复赋值计算长度,再来。以此类推。

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set file1="str1.txt"
  4. set file2="str2.txt"

  5. echo.>!file2!

  6. call :text_1
  7. pause
  8. goto :eof

  9. :text_1
  10. set t=0
  11. set "l0="
  12. set l1=1
  13. for /f "delims=" %%i IN ('type %file1%') do (
  14.         set /a t=!t!+1
  15.         set L2=%%i
  16.         call :str_L "%%i"
  17.         for %%r in (!L1!) do (
  18.                 if not "!l2:~0,%%r!"=="!L0!" (
  19.                         set L1=!x!
  20.                         set L0=%%i
  21.                         echo !t!:%%i
  22.                         echo %%i >>!file2!
  23.                 )
  24.         )
  25. )
  26. exit /b

  27. :str_L
  28. SET "L=%~1"
  29. SET /A N=0,M=8190 ,X=0
  30. FOR /L %%C IN (1,1,14) DO (
  31.         SET /A X0=%X%
  32.         SET /A "X=(!M!+!N!)/2+1"
  33.         FOR /F %%D IN ("!X!") DO  (
  34.                 IF "!L:~%%D!" EQU "" (SET /A M=!X! ) ELSE (SET /A N=!X!)
  35.         )
  36. )
  37. exit /b
复制代码


复制代码

str1.7z (630 Bytes, 下载次数: 5)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-17 07:48

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表