中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-29 10:12
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]文本排序并删类似行 查看 568 回复 1
楼 主 [求助]文本排序并删类似行 发表于 2009-05-16 12:27 ·  中国 广东 电信
中级用户
★★
积分 253
发帖 112
注册 2006-05-31 11:12
20年会员
UID 56308
性别 男
状态 离线
手上有一个注册表键值列表 1.txt 。
如下
----------------------------------
Windows Registry Editor Version 5.00
HKCR\CLSID\{123-45-67-890}
HKCR\CLSID\{123-45-67-890}\InprocServer32
HKCR\CLSID\{123-45-67-987}
HKCR\SOFTWARE\ABC
HKCR\SOFTWARE\ABC\APP
HKCR\SOFTWARE\ABC\APP\CurrentVersion
HKLM\SOFTWARE\DEF\
HKLM\SOFTWARE\ABC\Main
HKCR\CLSID\{123-45-67-890}\DefautICON
.....
----------------------------------

想弄个批处理把它整理一下生成另一个文件如2.txt,达到以下效果
----------------------------------
HKCR\CLSID\{123-45-67-890}
HKCR\SOFTWARE\ABC
HKLM\SOFTWARE\DEF\
......
----------------------------------
也就是原文件里有子键(一层)的只显示母键。
也就是说从后往前数"\"以前的键不能重复显示
当然最好能按字母顺序排列最好,不过猜想是不太可能的了。。
大家动动脑筋~~~



自己试着写了一点,头都大了,离目标还远得很。。

--------------------------------------------------------------------------------
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set n=10001
set lastid=

for /f "delims=" %%i in ('type 1.txt ^|find "HK"') do (
set key=%%i
set key=!key:[=!
set key=!key:]=!
for /f "tokens=1,2,3,* delims={}" %%a in ('echo !key!') do (
if "%%b"=="" call :nokua
if not "%%b"=="" (if "%%b"=="!lastid!" (echo × ID与上个重复) else call :pro)
)
)

echo.
echo ---------------END---------------
pause>nul

exit
:pro
echo √ 发现第!n:~1!个键值
echo !key! >>Proed.txt
for /f "tokens=1,2,3,* delims={}" %%a in ('echo !key!') do set lastid=%%b
set /a n+=1
goto :eof

:nokua
echo √ 发现第!n:~1!个键值(无ID)
echo !key! >>Proed.txt
set /a n+=1
goto :eof

:end

------------------------------------------------------------------------------
只能过滤掉相邻再行的{}里面值相同的行。大家来试试,感觉难度非常大。。。
2 发表于 2009-05-16 14:16 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@echo off&setlocal enabledelayedexpansion
set last=初始化
(for /f "eol=W delims=" %%a in ('sort 1.txt') do (
set now=%%a
for %%i in ("!last!") do (
if "!now:*%%~i=!"=="!now!" (
echo %%a
set last=%%a
)
)
))>2.txt
start 2.txt
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
junyee +1 2009-05-17 02:38
论坛跳转: