![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-25 22:16 |
共 47,812 主题排行 / 349,910 发帖 / 今日 0 篇 / 48,264 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 用批处理也可以简单实现删除文本相同行 |
| 可打印版本 5,687 / 18 |
| 第1楼 youxi01 | 发表于 2006-10-31 21:53 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
用批处理也可以简单实现删除文本相同行 @echo off
echo 正在查找文本相同行,请等待..... (echo 清除重复行后的文件内容:& echo.)>str_.txt setlocal enabledelayedexpansion for /f "delims=" %%i in (test.txt) do ( if not defined %%i set %%i=A & echo %%i>>str_.txt) echo 清理完毕,清理后的文件保存在:str_.txt pause>nul 经过测试,基本达到删除相同行的目的,但是暂时没有处理空行。 |
|
| 第2楼 namejm | 发表于 2006-10-31 22:25 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
用文本行的内容是否已经被定义过来决定是否输出,实现了代码的简洁化,比起常规思路要节省N多代码,楼主的手段确实高明。
观察你的代码,并没有用到变量延迟,所以 setlocal enabledelayedexpansion 一句可以省略。 |
|
| 第3楼 9527 | 发表于 2006-10-31 23:17 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
不过对与以下形式的文本好像就无能为力了
A HELLO WORLD set c= A YOU HELLO YOU set a= A YOU set sdfs= set sdfs= HEllo you set c= you are very good |
|
| 第4楼 NaturalJ0 | 发表于 2006-10-31 23:19 |
| 银牌会员 发帖 533 积分 1,181 | |
|
如果有一万行似乎也行不通。
|
|
| 第5楼 namejm | 发表于 2006-10-31 23:27 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
看来对不符合变量命名规则的行内容、超过变量个数限制的文本都无法正确处理。
|
|
| 第6楼 youxi01 | 发表于 2006-11-01 00:58 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
至于大小写的问题,倒是比较好处理:添一个开关 /I即可。
if /I not defined %%i set %%i=A & echo %%i>>str_.txt) 但是对于“特殊的文本行”还是没想到好的解决办法,望高手指点。 |
|
| 第7楼 lxmxn | 发表于 2006-11-01 01:30 |
| 版主 发帖 4,938 积分 11,386 | |
|
小弟愚笨,不明白这一句(if /I not defined %%i set %%i=A & echo %%i>>str_.txt)为什么可以起到"删除文本相同的行"的作用,想了半天没想出来,还请各位大侠不吝赐教,详细的分析一下其机理。 |
|
| 第8楼 redtek | 发表于 2006-11-01 01:52 |
| 金牌会员 发帖 1,147 积分 2,902 | |
|
原理是每从test.txt里取一行就给它赋值为A,
例:如果取了一行“ABC”,那么它就让 ABC=A,这样是不是变量ABC非空值而是被定义了? 然后if not defined会依次检查从这个test.txt文本内取出来的每一行, 它把取出来的这一条当做一个变量来看,判断它是不是没被定义过,即看是否没有被赋值。 如果没有被赋值当然说明这个变量(取出来的这一行)跟本就出现过(没重复过),说明这行是非重复的行。 …… 一直到结束,只要取一行就把这行以变量命名来赋个值, 只要将来判断新取的行(早被当做变量了)被赋过值,那一定是重复的, 所以就不往过滤后的文本文件内写东东了:) |
|
| 第9楼 youxi01 | 发表于 2006-11-01 02:03 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
@echo off
echo 正在查找文本相同行,请等待..... (echo 清除重复行后的文件内容:& echo.)>str_.txt setlocal enabledelayedexpansion for /f "delims=" %%i in (test.txt) do ( set /a flag=0 echo %%i | find "=" >nul && set /a flag=1 for /f "tokens=1* delims==" %%a in ("%%i") do ( if /i not defined %%a%%b ( set %%a%%b=A if !flag! equ 1 (echo %%a=%%b>>str_.txt) else echo %%a>>str_.txt ) ) ) echo 清理完毕,清理后的文件保存在:str_.txt pause>nul 说明:以上代码成功解决“=”的问题,包括set var=(不含空格) set var=(含空格) 但以上代码仍然不能解决文本内容出现> <等一系列问题。 |
|
| 第10楼 namejm | 发表于 2006-11-01 02:37 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
9F的代码虽然能解决一个“=”的问题,但是仍然不能解决多个“=”号的情况,并且速度非常慢,处理3F的文本也需要好几秒,问题出在 echo %%i|find "=" 这一句上。看来还得多费点心思。
|
|
| 第11楼 electronixtar | 发表于 2006-11-01 03:38 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
看来批处理不适合复杂的文本处理,天生缺陷啊。找找第三方工具试试
|
|
| 第12楼 vkill | 发表于 2006-11-01 05:09 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
用sed可以轻松实现~ 处理问题时最有效的才是最好的,我是这样认为,用第三方工具又何妨?
http://www.cn-dos.net/forum/viewthread.php?tid=24210&fpage=1&highlight=sed 选择性地删除特定行: -------- # 显示通篇文档,除了两个正则表达式之间的内容 sed '/Iowa/,/Montana/d' # 删除文件中相邻的重复行(模拟“uniq”) # 只保留重复行中的第一行,其他行删除 sed '$!N; /^\(.*\)\n\1$/!P; D' # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存 # 大小,或者使用GNU sed。 sed -n 'G; s/\n/&&/; /^\(*\n\).*\n\1/d; s/\n//; h; P' # 删除除重复行外的所有行(模拟“uniq -d”) sed '$!N; s/^\(.*\)\n\1$/\1/; t; D' # 删除文件中开头的10行 sed '1,10d' # 删除文件中的最后一行 sed '$d' # 删除文件中的最后两行 sed 'N;$!P;$!D;$d' # 删除文件中的最后10行 sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1 sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2 # 删除8的倍数行 gsed '0~8d' # 只对GNU sed有效 sed 'n;n;n;n;n;n;n;d;' # 其他sed # 删除匹配式样的行 sed '/pattern/d' # 删除含pattern的行。当然pattern # 可以换成任何有效的正则表达式 # 删除文件中的所有空行(与“grep '.' ”效果相同) sed '/^$/d' # 方法1 sed '/./!d' # 方法2 # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。 # (模拟“cat -s”) sed '/./,/^$/!d' #方法1,删除文件顶部的空行,允许尾部保留一空行 sed '/^$/N;/\n$/D' #方法2,允许顶部保留一空行,尾部不留空行 # 只保留多个相邻空行的前两行。 sed '/^$/N;/\n$/N;//D' # 删除文件顶部的所有空行 sed '/./,$!d' # 删除文件尾部的所有空行 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 对所有sed有效 sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只对 gsed 3.02.*有效 # 删除每个段落的最后一行 sed -n '/^$/{p;h;};/./{x;/./p;}' |
|
| 第13楼 electronixtar | 发表于 2006-11-01 05:34 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
看来得下载一个sed了,哇咔咔
|
|
| 第14楼 lxmxn | 发表于 2006-11-01 09:27 |
| 版主 发帖 4,938 积分 11,386 | |
|
谢谢 redtek 的指点,明白了。开始还以为如果%%i的值是空值的话,就表示没有定义呢,现在才理解了"defined"的真正含义是要用"set"定义之后才算是"defined",呵呵。 |
|
| 第15楼 3742668 | 发表于 2006-11-05 01:51 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
楼主所用的方法我也曾经尝试过,不过由于局限太大的原因基本不使用。用批处理来处理文件的确比较麻烦,处理比较特殊的文件的时候提倡还是用vbs或第三方工具。 对于数据量不大的情况,适当地使用批处理还是比较方便的: 时间关系,以上代码均未测试.暂时写这么一点东西,以后再把12F实现的功能全部写出来. 顺便向和俺一样双休日不得休息的同志们致敬! |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |