中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-05 04:23
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求助:用sed命令提高执行效率 查看 1,029 回复 7
楼 主 求助:用sed命令提高执行效率 发表于 2007-06-29 11:29 ·  中国 湖北 襄阳 电信
初级用户
积分 25
发帖 13
注册 2007-06-15 11:32
19年会员
UID 91401
性别 男
状态 离线
各位高手,本人想编写一个批处理用于剔除文本文件中相同记录,虽然下面的脚本能够完成任务,但我认为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
2 发表于 2007-06-29 11:34 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
举个具体的例子吧。
3 发表于 2007-06-29 11:39 ·  中国 湖北 襄阳 电信
初级用户
积分 25
发帖 13
注册 2007-06-15 11:32
19年会员
UID 91401
性别 男
状态 离线
比如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

如果有两条\三条......相同的话就保留一条记录.
4 发表于 2007-06-29 12:58 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
gawk:
gawk "!arg++" Yourfile


#Gawk 下载
http://www.cn-dos.net/forum/viewthread.php?tid=31098&page=1#pid205571
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
wbshu +1 2007-06-29 14:18
5 发表于 2007-06-29 14:06 ·  中国 湖北 襄阳 电信
初级用户
积分 25
发帖 13
注册 2007-06-15 11:32
19年会员
UID 91401
性别 男
状态 离线
谢谢!!!要学的东西真多啊!
6 发表于 2007-06-29 23:23 ·  中国 浙江 杭州 华数宽带
银牌会员
★★★
积分 2,000
发帖 621
注册 2007-01-01 00:00
19年会员
UID 75212
性别 男
状态 离线
这个 问题 用 awk 解决是最合适的选择;
用sed 就比较麻烦了;代码如下;

sed -n "G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P" test.txt
7 谢谢!!! 发表于 2007-06-30 00:20 ·  中国 广东 深圳 电信
新手上路
积分 2
发帖 1
注册 2007-03-20 06:07
19年会员
UID 82318
性别 男
状态 离线
谢谢!!!
8 发表于 2007-07-01 17:02 ·  中国 湖北 襄阳 电信
初级用户
积分 25
发帖 13
注册 2007-06-15 11:32
19年会员
UID 91401
性别 男
状态 离线
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


总之,谢谢你的回复!
论坛跳转: