中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 求助:用sed命令提高执行效率 上一主题 | 下一主题
wbshu
初级用户





积分 25
发帖 13
注册 2007-6-15
状态 离线
『楼 主』:  求助:用sed命令提高执行效率

各位高手,本人想编写一个批处理用于剔除文本文件中相同记录,虽然下面的脚本能够完成任务,但我认为sed命令非常强大,应该能够提高我的脚本效率.本人刚接触sed命令,还请高手指教!!
@echo off
set /a num=0
for /f %%i in (test.txt) do set /a num+=1
echo  发现了%num%条记录。
echo.
echo  正在剔除相同记录,请稍后......
echo.
for /l %%a in (1,1,%num%) do (
        sed -n "%%a"p test.txt>temp1.txt
        rem 提取比较项
        for /f "tokens=*" %%i in (temp1.txt) do (
                echo %%i>temp2.txt
                sed "/%%i/d" test.txt>>temp2.txt
                rem 删除相同项。    这条语句能用嵌套语句吗?
                type temp2.txt>test.txt
                )
        )       
set /a num=0
for /f %%i in (test.txt) do set /a num+=1
echo.
echo  保留了%num%条文件记录。
del /f /q temp*.txt

2007-6-29 11:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

举个具体的例子吧。

2007-6-29 11:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wbshu
初级用户





积分 25
发帖 13
注册 2007-6-15
状态 离线
『第 3 楼』:  

比如test.txt文件是:

sss   bbb   ccc
eeeeee   edd   ffff
sssss wwwww
sss   bbb   ccc
aaa  ddd  eee

文件里面第一条和第4条相同,我要去掉第4条的记录最后成这样:
sss   bbb   ccc
eeeeee   edd   ffff
sssss wwwww
aaa  ddd  eee

如果有两条\三条......相同的话就保留一条记录.

2007-6-29 11:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

gawk:
gawk "!arg[$0]++" Yourfile
#Gawk 下载
http://www.cn-dos.net/forum/viewthread.php?tid=31098&page=1#pid205571

   此帖被 +1 点积分    点击查看详情   
评分人:【 wbshu 分数: +1  时间:2007-6-29 14:18


2007-6-29 12:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wbshu
初级用户





积分 25
发帖 13
注册 2007-6-15
状态 离线
『第 5 楼』:  

谢谢!!!要学的东西真多啊!

2007-6-29 14:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 6 楼』:  

这个 问题 用 awk 解决是最合适的选择;
用sed 就比较麻烦了;代码如下;

sed -n "G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P" test.txt

2007-6-29 23:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gan2031
新手上路





积分 2
发帖 1
注册 2007-3-20
状态 离线
『第 7 楼』:  谢谢!!!

谢谢!!!

2007-6-30 00:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wbshu
初级用户





积分 25
发帖 13
注册 2007-6-15
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by bjsh at 2007-6-29 11:23 PM:
这个 问题 用 awk 解决是最合适的选择;
用sed 就比较麻烦了;代码如下;

sed -n "G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P" test.txt

这条命令好像不适合本例,应该将“^\([ -~]*\n\)”参数换成“^\(.*\n\)”:

我试了一下,对于本例而言下面的代码也能达到效果:

sed -n "G; /^\(.*\n\).*\n\1/d; h ;P" Test.txt


总之,谢谢你的回复!

2007-7-1 17:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: