免费注册 查看新帖 |

Chinaunix

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

[文本处理] 以 [小写字符] 标示出杂质 [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
21 [报告]
发表于 2013-10-28 16:56 |只看该作者
回复 20# damcool
闲来没事,比较了下目前所有脚本的效率:
  1. #测试数据的总行数(由楼主提供的数据复制而来)
  2. [root@localhost ~]# wc -l i
  3. 8356 i

  4. #本人的第一个脚本
  5. [root@localhost ~]# time ./a1 i | ./a2 | ./a1 | ./a2 > /dev/null

  6. real    0m5.945s
  7. user    0m3.985s
  8. sys     0m0.425s

  9. #damcool的第一个脚本
  10. [root@localhost ~]# time awk -f damcool1 i | tac | awk -f damcool1 | tac > /dev/null

  11. real    0m29.477s
  12. user    0m21.578s
  13. sys     0m0.498s

  14. #damcool的第二个脚本
  15. [root@localhost ~]# time awk -f damcool2 i > /dev/null

  16. real    0m16.412s
  17. user    0m12.278s
  18. sys     0m0.144s

  19. #rdcwayx的脚本
  20. [root@localhost ~]# time awk -f rdcwayx i > /dev/null

  21. real    0m10.298s
  22. user    0m7.183s
  23. sys     0m0.539s

  24. #本人的第二个脚本
  25. [root@localhost ~]# time awk -f yestreenstars i > /dev/null

  26. real    0m8.120s
  27. user    0m5.816s
  28. sys     0m0.220s
复制代码
  1. [root@localhost ~]# tail a1 a2 damcool1 damcool2 rdcwayx yestreenstars
  2. ==> a1 <==
  3.                         }
  4.                         for(j=i+1;j<=i+a[$(i+1)]&&j<=NF;j++){
  5.                                 if($j=="X")break;
  6.                                 $j=tolower($j)
  7.                         }
  8.                         $i=tolower($i)
  9.                 }
  10.         }
  11. }
  12. 1

  13. ==> a2 <==
  14. #!/bin/awk -f
  15. BEGIN{
  16.         FS=""
  17. }
  18. {
  19.         for(i=1;i<=NF;i++)a[i]=a[i]$i
  20. }
  21. END{
  22.         for(i=1;i<=NF;i++)print a[i]
  23. }

  24. ==> damcool1 <==
  25.                         {
  26.                                 printf tolower(a[i]);
  27.                                 x=x-1;
  28.                                 b[i]=(b[i]>0)?b[i]-1:0;
  29.                         }
  30.                         else printf a[i];
  31.                 }
  32.         }
  33.         printf "\n";
  34. }

  35. ==> damcool2 <==
  36.                                         l=l""tolower(a[j]);
  37.                                         c[j]=c[j]-1;
  38.                                 }
  39.                                 else l=l""a[j];
  40.                         }
  41.                 }
  42.                 m[i]=l;
  43.         }
  44.         for (i=1;i<=k;i++) print m[i];
  45. }

  46. ==> rdcwayx <==
  47.         }
  48.     for (j=1;j<=NR;j++)
  49.        { for (i=1;i<=NF;i++)
  50.            { if (e[i OFS j]||d[i OFS j])
  51.                      { printf tolower(a[i OFS j]) }
  52.              else {printf a[i OFS j] }
  53.            }
  54.          printf ORS
  55.        }
  56. }

  57. ==> yestreenstars <==
  58.                                 }
  59.                                 b[j,i]=tolower(b[j,i])
  60.                         }
  61.                 }
  62.         }
  63.         for(i=1;i<=NR;i++){
  64.                 for(j=1;j<NF;j++)printf b[i,j];
  65.                 print b[i,NF]
  66.         }
  67. }
  68. [root@localhost ~]#
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
22 [报告]
发表于 2013-10-28 17:09 |只看该作者
谢谢测试,我的脚本效果还不错

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
23 [报告]
发表于 2013-10-28 22:02 |只看该作者
yestreenstars 发表于 2013-10-28 16:56
回复 20# damcool
闲来没事,比较了下目前所有脚本的效率:

很不错的比较,让我了解到REGEXP函数或相关的功能效率很差,我修订了一版。速度一下子上去了。另外好像a1a2a1a2版有点问题。
  1. #!/bin/awk
  2. BEGIN{
  3.         ord["A"]=1;
  4.         ord["B"]=2;
  5.         ord["C"]=3;
  6.         ord["D"]=4;
  7. }
  8. {
  9.         n=split($0,a,"");
  10.         for (i=1;i<=n;i++)
  11.         {
  12.                 if (toupper(a[i])=="X")
  13.                 {
  14.                         for (j=i-1;j>=i-ord[toupper(a[i-1])];j--)
  15.                         {
  16.                                 if (ord[toupper(a[j])]==0) break;
  17.                                 a[j]=tolower(a[j]);
  18.                         }
  19.                         x=ord[toupper(a[i+1])];
  20.                         a[i]="x";
  21.                         b[i]=5;
  22.                 }
  23.                 else
  24.                 {
  25.                         b[i]=(b[i]>4)?ord[toupper(a[i])]:b[i];
  26.                         if (x>0 || b[i]>0)
  27.                         {
  28.                                 x=(x>0)?--x:0;
  29.                                 b[i]=(b[i]>0)?--b[i]:0;
  30.                                 a[i]=tolower(a[i]);
  31.                         }
  32.                 }
  33.         }
  34.         l="";x=0;
  35.         for (i=1;i<=n;i++) l=l""a[i];
  36.         m[++k]=l;
  37. }
  38. END{
  39.         for (i=k;i>0;i--)
  40.         {
  41.                 n=split(m[i],a,"");
  42.                 l="";x=0;
  43.                 for (j=1;j<=n;j++)
  44.                 {
  45.                         if (toupper(a[j])=="X")
  46.                         {
  47.                                 l=l"x";
  48.                                 c[j]=5;
  49.                         }       
  50.                         else
  51.                         {
  52.                                 c[j]=(c[j]>4)?ord[toupper(a[j])]:c[j];
  53.                                 if (c[j]>0)
  54.                                 {
  55.                                         c[j]--;
  56.                                         l=l""tolower(a[j]);
  57.                                 }
  58.                                 else l=l""a[j];
  59.                         }
  60.                 }
  61.                 m[i]=l;
  62.         }
  63.         for (i=1;i<=k;i++) print m[i];
  64. }
复制代码
比较结果如下图:

评分

参与人数 1可用积分 +4 收起 理由
rdcwayx + 4 制造数据的方法很给力啊, 赞一个。

查看全部评分

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

sed 版:
  1. sed -nr -f f.sed file
  2. cat f.sed
  3. #!/usr/bin/sed

  4. :re;
  5. s/X/x/g;

  6. s/[ABCD]x/\L&/;
  7. s/x[ABCD]/\L&/;

  8. s/[ABCD]x/\L&/;
  9. s/x[ABCD]/\L&/;

  10. s/[ABCD][bB]x/\L&/;
  11. s/x[bB][ABCD]/\L&/;

  12. s/x[cC][ABCDabcd]{0,1}[ABCD]/\L&/;
  13. s/[ABCD][ABCDabcd]{0,1}[cC]x/\L&/;

  14. s/x[dD][ABCDabcd]{0,2}[ABCD]/\L&/;
  15. s/[ABCD][ABCDabcd]{0,2}[dD]x/\L&/;

  16. tre;

  17. /#/{
  18.         s/#//g;
  19.         s/^/\n/;
  20.         h;
  21.         :rev2;
  22.                 g;
  23.                 s/\n[^\n]/\n/g;
  24.                 x;
  25.                 s/\n+([^\n])[^\n]*/\1/gp;
  26.         trev2;
  27.         q
  28. };

  29. H;

  30. ${
  31.         :rev1;
  32.                 g;
  33.                 s/\n[^#\n]/\n/g;
  34.                 x;
  35.                 s/\n([^#\n])[^\n]*/\1/g;
  36.                 s/\n#.*//;
  37.                 s/^/#/;
  38.                 H;
  39.                 x;
  40.                 /^\n+#/{;
  41.                         s/^\n+//g;
  42.                         tre;
  43.                 }
  44.                 x;
  45.         trev1;
  46. }
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
25 [报告]
发表于 2013-10-28 23:17 |只看该作者
回复 24# yinyuemi
运行结果不太对劲哦~
[root@localhost ~]# sed -nr -f s i
aBDCDCDCaaxcxcdcCABABDCDcDcAabxbaBDCdCDCAABbCDCcaxdbbxaBDCDCDcAAbbcdxcca
bBCDCCABbBabxcdcDCAAbbcdxccaBBbbBABDCDCDCAAbBCDcCaxbbbABCDAAaxbcDADCaxxx
xaBCDCDCaaxbbCCDCCABAbDCdCdCAabxbaBdABACCCaxcdcdCAaBBcDcCABbbxaBDCDCDcaa
aACDCCAAdCabdCDCDCAabxcdxcxaBCDdBABdCDCDCAAbbxbxcaaBBBAbCDAAaxbcDADCAbbB
aDCAAAAaxaBcdCCCCCDCabxbbCcDCCAbABDcDCDCAabxbaBdABdCCCaxcdcDCaAAAABBCdcC
xcccAABDcAaxxaADCCCCCCaACCaAAAAaAAaxbbdccxacDACdAaxcbbBbBBBAAaBCADDCAaxc
xaBCDCDCaaxbbCCDCCABABDCDCdCAabxbaBdABACCcaxcdcdCAaBBCDcCABbbxaBDCDCDCaA
[root@localhost ~]#
红色部分为有问题的地方~
   

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


    嗯, 刚才我也发现了, 你再试试我现在的版本有没有问题

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
27 [报告]
发表于 2013-10-28 23:27 |只看该作者
回复 26# yinyuemi
没问题~

   

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


    多谢测试!
    sed的效率和各位的awk要低不少~

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
29 [报告]
发表于 2013-10-28 23:34 |只看该作者
回复 28# yinyuemi
是的,不过能写出来就很厉害了,一般这么长的sed我是写不出来的~

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
30 [报告]
发表于 2013-10-28 23:40 |只看该作者
回复 23# damcool
为啥我这里测试就没问题咧?
  1. #用你提供的方法制造数据(不得不说,学了一招~)
  2. [root@localhost ~]# tr -dc 'A-DX' < /dev/urandom | head -c 720000 | fold -w 72 > i
  3. [root@localhost ~]# wc -l i
  4. 9999 i

  5. #我的第一个脚本
  6. [root@localhost ~]# time ./a1 i | ./a2 | ./a1 | ./a2 > a1a2.r

  7. real    0m4.586s
  8. user    0m4.429s
  9. sys     0m0.026s

  10. #我的第二个脚本
  11. [root@localhost ~]# time awk -f a i > a.r

  12. real    0m7.116s
  13. user    0m6.931s
  14. sys     0m0.139s

  15. #你的新脚本(确实比之前的快多了~)
  16. [root@localhost ~]# time awk -f d i > d.r

  17. real    0m4.969s
  18. user    0m4.900s
  19. sys     0m0.018s

  20. #差异比较
  21. [root@localhost ~]# diff a1a2.r a.r
  22. [root@localhost ~]# diff a1a2.r d.r
  23. [root@localhost ~]# diff a.r d.r
  24. [root@localhost ~]#
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP