免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: linuxnextyear
打印 上一主题 下一主题

关于脚本执行效率的问题!(太慢)!(结帖) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-01-10 14:19 |只看该作者
原帖由 ly5066113 于 2008-1-10 13:47 发表
大致有点了解了吧,对xml、html还是不懂,还是修改你的代码吧。
你的第一个命令和第四个命令不能一次性完成么?
:a;$!{N;ba} 这段代码就可以一次性把你的文件都读到pattern space。
所以可以改下顺序,整合成 ...

恩,多谢楼上的,我这个确实有点复杂!
你的这个命令和这个执行的速度差不多:
sed -i -e "s@\&lt;@gmmlt@g" -e "s@\&gt;@gmmgt@g" -e "s@<a href=[^>]*>${keyword}</a>([^)]*)@${keyword}@g" -e ':a;$!{N;ba}' -e "s@${keyword}@${urlto}@" -e "s@gmmlt@<@g" -e "s@gmmgt@>@g" $pathname$tmp

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
32 [报告]
发表于 2008-01-10 14:30 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 14:19 发表

恩,多谢楼上的,我这个确实有点复杂!
你的这个命令和这个执行的速度差不多:
sed -i -e "s@\<@gmmlt@g" -e "s@\>@gmmgt@g" -e "s@]*>${keyword}([^)]*)@${keyword}@g" -e ':a;$!{N;ba}' -e "s@${keyword} ...


但你这个命令是不对的,:a;$!{N;ba}这个命令前面的命令,只有文件的第一行做了替换,其他的行都不会做。

论坛徽章:
0
33 [报告]
发表于 2008-01-10 15:13 |只看该作者
原帖由 ly5066113 于 2008-1-10 14:30 发表


但你这个命令是不对的,:a;$!{N;ba}这个命令前面的命令,只有文件的第一行做了替换,其他的行都不会做。


?????我没理解你的意思
[root@cache251-216 stock]# more ttt
a
a
a

[root@cache251-216 stock]# sed "s@a@http://www.sohu.com@g" ttt
http://www.sohu.com
http://www.sohu.com
http://www.sohu.com

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
34 [报告]
发表于 2008-01-10 15:23 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 15:13 发表


?????我没理解你的意思
[root@cache251-216 stock]# more ttt
a
a
a

[root@cache251-216 stock]# sed "s@a@http://www.sohu.com@g" ttt
http://www.sohu.com
http://www.sohu.com
http://www.s ...


在你的ttt后面在加3条记录:
a
a
a
b
b
b

然后执行sed -e 's@a@http://www.sohu.com@g' -e ':a;$!{N;ba}' -e 's@b@123@g' ttt

看看a被替换了几个,b被替换了几个。
这就是在:a;$!{N;ba}这个命令的前后的区别。

论坛徽章:
0
35 [报告]
发表于 2008-01-10 15:30 |只看该作者

回复 #34 ly5066113 的帖子


  1. [root@cache251-216 stock]# sed -e 's@a@http://www.sohu.com@g' -e ':a;$!{N;ba}' -e 's@b@123@g' ttt
  2. [url]http://www.sohu.com[/url]
  3. a
  4. a
  5. 123
  6. 123
  7. 123
复制代码

这是为什么啊?不是应该执行完一个-e在执行下一个嘛?

那我这样写就对了吧:

  1. sed -i -e ':a;$!{N;ba}' -e "s@\&lt;@<@g;s@\&gt;@>@g;s@<a href=[^>]*>${keyword}</a>([^)]*)@${keyword}@g;
  2. s@${keyword}@${urlto}@;s@gmmlt@<@g;s@gmmgt@>@g" $pathname$tmp
复制代码


而且这样替换一个网页差不多是6s左右的时间,虽然说比我最开始的那个程序快多了,到那时这样效率也太慢了,还有什么办法嘛?

[ 本帖最后由 linuxnextyear 于 2008-1-10 15:36 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
36 [报告]
发表于 2008-01-10 15:41 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 15:30 发表

[root@cache251-216 stock]# sed -e 's@a@http://www.sohu.com@g' -e ':a;$!{N;ba}' -e 's@b@123@g' ttt
http://www.sohu.com
a
a
123
123
123

这是为什么啊?不是应该执行完一个-e在执行下一个嘛? ...


执行完一个-e在执行下一个,这是对的。
sed是按行读记录的,因此读如第一行后:
这个时候pattern space只有第一行记录
先做s@a@http://www.sohu.com@g这个替换
然后:a;$!{N;ba},这是个循环,会一直把文本文件的所有记录读进来,但除了读记录之外,什么都不做
最后s@b@123@g,这个时候pattern space中已经是整个文本了,所以会替换所有的。

论坛徽章:
0
37 [报告]
发表于 2008-01-10 15:54 |只看该作者

回复 #36 ly5066113 的帖子

明白了,用awk改写这个sed匹配能实现嘛?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
38 [报告]
发表于 2008-01-10 16:13 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 15:54 发表
明白了,用awk改写这个sed匹配能实现嘛?


照葫芦画瓢:
  1. awk -v k=${keyword} -v u=${urlto} 'k{i++}{gsub(/&lt;/;"<");gsub(/&gt;/;">");gsub("<a href=[^>]*>"k"</a>([^)]*)",k);if(i==1)sub(k,u);gsub(/gmmlt/;"<");gsub(/gmmgt/;">")}' $pathname$tmp
复制代码

论坛徽章:
0
39 [报告]
发表于 2008-01-10 16:44 |只看该作者

回复 #38 ly5066113 的帖子

运行脚本出错了:
awk: cmd. line:1: k{i++}{gsub(/&lt;/;"<");gsub(/&gt;/;">");gsub("<a href=[^>]*>"k"</a>([^)]*)",k);if(i==1)sub(k,u);gsub(/gmmlt/;"<");gsub(/gmmgt/;">")}
awk: cmd. line:1:                   ^ syntax error
awk: cmd. line:1: fatal: 0 is invalid as number of arguments for gsub
awk: cmd. line:1: k{i++}{gsub(/&lt;/;"<");gsub(/&gt;/;">");gsub("<a href=[^>]*>"k"</a>([^)]*)",k);if(i==1)sub(k,u);gsub(/gmmlt/;"<");gsub(/gmmgt/;">")}

能看出是哪里的问题嘛?

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
40 [报告]
发表于 2008-01-10 16:51 |只看该作者
原帖由 linuxnextyear 于 2008-1-10 16:44 发表
运行脚本出错了:
awk: cmd. line:1: k{i++}{gsub(/</;"");gsub("]*>"k"([^)]*)",k);if(i==1)sub(k,u);gsub(/gmmlt/;"")}
awk: cmd. line:1:                   ^ syntax error
awk: cmd. line:1: fatal: 0  ...


写错了,应该用,

  1. awk -v k=${keyword} -v u=${urlto} 'k{i++}{gsub(/&lt;/,"<");gsub(/&gt;/,">");gsub("<a href=[^>]*>"k"</a>([^)]*)",k);if(i==1)sub(k,u);gsub(/gmmlt/,"<");gsub(/gmmgt/,">")}' $pathname$tmp
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP