免费注册 查看新帖 |

Chinaunix

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

配对-格式调整 [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
11 [报告]
发表于 2012-04-08 13:07 |只看该作者
回复 9# mpstat


    相当犀利, 效率应该也很高~

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
12 [报告]
发表于 2012-04-08 13:10 |只看该作者
回复 10# winway1988


    非常好,可以再进一步想下如何不在END部分打印结果,这样效率会更好~

论坛徽章:
0
13 [报告]
发表于 2012-04-08 13:31 |只看该作者
本帖最后由 mpstat 于 2012-04-08 13:34 编辑

回复 11# yinyuemi

  1. export l=10000;seq $l|awk -va=$l 'BEGIN{srand();}{v=int(rand()*100);v=(a-NR)>2*v?v:int((a-NR)/2); for(i=0;i<v;++i){getline; print NR,"aaa"};for(i=0;i<v;++i){getline;print NR,"bbb"};}' > cc
复制代码
生成你的文件,改一下10000测测效率

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
14 [报告]
发表于 2012-04-08 14:21 |只看该作者
本帖最后由 yinyuemi 于 2012-04-08 14:37 编辑

回复 13# mpstat


    Thanks!
测试结果如下:


  1. 环境:cygwin
  2. CYGWIN_NT-5.1 version 1.7.11

  3. time awk -f jiejie455.awk testfile >/dev/null

  4. real    0m2.180s
  5. user    0m2.030s
  6. sys     0m0.124s

  7. time perl -lane '{push(@a,"@F") if($F[-1] eq "aaa");print shift @a," @F" if($F[-1] eq "bbb")}' testfile >/dev/null

  8. real    0m0.830s
  9. user    0m0.718s
  10. sys     0m0.061s

  11. 参考jason680的code略作修改,如下
  12. cat jason680_m.pl
  13. #!/bin/perl
  14. use strict;
  15. my @F;
  16. my @a;
  17. open(f,"@ARGV[0]") or die "$!";
  18. while(<f>){
  19.   chomp;
  20.   push @a, $_ if($_ eq "aaa");
  21.   print shift @a," $_" if($_ eq "bbb");
  22. }
  23. close(f);

  24. time perl jason680_m.pl testfile >/dev/null

  25. real    0m0.245s
  26. user    0m0.124s
  27. sys     0m0.092s


  28. time sed -nr -f mpstat.sed testfile >/dev/null  #sed的效率有点让人失望,不过不是code的问题,我觉得mpstat的code已经很犀利了,慢的原因应该是正则部分

  29. real    0m9.227s
  30. user    0m9.155s
  31. sys     0m0.046s

  32. time awk -f winway1988.awk testfile >/dev/null

  33. real    0m0.443s
  34. user    0m0.358s
  35. sys     0m0.031s

  36. cat ss.awk # 额的awk code,比perl还是慢,求效率更高的~
  37. /aaa/{if(t){i=t=j=0}a[i++]=$0}
  38. /bbb/{print $0,a[j++];t=1}

  39. time awk -f ss.awk testfile >/dev/null

  40. real    0m0.330s
  41. user    0m0.249s
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
15 [报告]
发表于 2012-04-08 14:23 |只看该作者
回复 12# yinyuemi


    试试这个
  1. awk '/aaa/{a[++ntail]=$0}/bbb/{print a[++nhead],$0}'
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
16 [报告]
发表于 2012-04-08 14:27 |只看该作者
回复 15# winway1988


    效率提高了~
  1. time awk -f winway1988_2.awk testfile >/dev/null

  2. real    0m0.341s
  3. user    0m0.265s
  4. sys     0m0.031s
复制代码

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
17 [报告]
发表于 2012-04-08 15:31 |只看该作者
awk '/aaa/{hash[++i]=$0}/bbb/{print hash[++j]"\t"$0}' file

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
18 [报告]
发表于 2012-04-08 15:36 |只看该作者
重复了

论坛徽章:
0
19 [报告]
发表于 2012-04-08 15:40 |只看该作者
回复 16# yinyuemi


这个帖子真霸道

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
20 [报告]
发表于 2012-04-08 16:25 |只看该作者
不管需要不需要 awk总会把$0切割成字段.这会耗费不少时间.就像perl用了-a.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP