免费注册 查看新帖 |

Chinaunix

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

4亿行数据,挑出长度不合要求的行 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-06-12 17:41 |只看该作者
回复 17# aluoyeshi


    你这个是匹配 非10个字符 的行吗?我运行的结果好像不对啊

论坛徽章:
0
22 [报告]
发表于 2010-06-12 18:03 |只看该作者
回复 21# 草肃威


    是,删除10个字符的行,有什么问题?

论坛徽章:
0
23 [报告]
发表于 2010-06-12 22:38 |只看该作者
简单文本处理,sed效率最高,但是如果逻辑复杂的话,写出来,估计自己都很难理解。
awk比较容易理解,但是处理手段还是有一定限制。语言不够丰富,逻辑复杂中等,效率中等。
perl逻辑性强、灵活度最高,但效率较sed或awk低。
...
perl看来只能用在低数据量的处理场合,如原型测试、网管或测试环境等。

上面的话见 http://bbs.chinaunix.net/thread-1714400-5-2.html 47楼。
为了上面的评价,和 zenith518 纠结了几层楼。
以扯淡结帖。 俺想,lz的测试结果可以作为一个参考。

ps: 不知道 zenith518 会不会嫌弃 4亿行的数据量太小,不足以说明问题

论坛徽章:
0
24 [报告]
发表于 2010-06-12 22:41 |只看该作者
推荐大家用 Perl ,而不是 Shell 来处理文本

亦或像对待 sed、awk 一样,将 Perl 当成 Shell 的一部分

论坛徽章:
0
25 [报告]
发表于 2010-06-12 23:49 |只看该作者
回复 22# aluoyeshi


    给个和上面的逻辑一样的吧, 把不等于10个字符的行输出到另一个文件
这样不会有IO的差别

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
26 [报告]
发表于 2010-06-13 08:31 |只看该作者
刚才试了下,sed比perl快
  1. 08:27:44 root@ST-TEST:[/]#>file
  2. a=1
  3. 08:27:45 root@ST-TEST:[/]#a=1
  4. 08:27:45 root@ST-TEST:[/]#while [ $a -le 1000 ];do
  5. >         ((a=$a+1))
  6. >         cat /etc/services >>file
  7. > done
  8. 08:27:55 root@ST-TEST:[/]#time perl -lne 'print if length != 10' file > list.bad

  9. real    0m31.04s
  10. user    0m25.94s
  11. sys     0m1.99s
  12. 08:29:06 root@ST-TEST:[/]#time sed '/........../d' file > list.bad2

  13. real    0m10.69s
  14. user    0m7.73s
  15. sys     0m1.47s
  16. 08:29:33 root@ST-TEST:[/]#time perl -lne 'print if length != 10' file > list.bad3

  17. real    0m30.37s
  18. user    0m25.68s
  19. sys     0m2.00s
  20. 08:30:19 root@ST-TEST:[/]#
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
27 [报告]
发表于 2010-06-13 08:39 |只看该作者
上一贴sed命令的结果与perl不一致,重试了下
  1. 08:36:06 root@ST-TEST:[/]#time sed '/^.\{10\}$/d' file > list.bad4

  2. real    0m19.47s
  3. user    0m12.48s
  4. sys     0m2.73s
  5. 08:36:43 root@ST-TEST:[/]#time sed '/^.\{10\}$/d' file > list.bad5

  6. real    0m19.13s
  7. user    0m12.46s
  8. sys     0m2.71s
  9. 08:37:09 root@ST-TEST:[/]#time perl -lne 'print if length != 10' file > list.bad6

  10. real    0m29.88s
  11. user    0m22.17s
  12. sys     0m1.37s
  13. 08:37:43 root@ST-TEST:[/]#
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
28 [报告]
发表于 2010-06-13 09:11 |只看该作者
awk 'length($0)!=10' file换成awk '!/^..........$/' file后速度提高很多,想必perl -lne 'print if length != 10' file换成同样的思路,速度也会提高。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
29 [报告]
发表于 2010-06-13 09:12 |只看该作者
回复 21# 草肃威

那个写法要改成如下之一:
sed '/^..........$/d'
sed '/^.\{10\}$/d'

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
30 [报告]
发表于 2010-06-13 09:21 |只看该作者
没想到是这样的结果。
  1. 09:16:50 root@ST-TEST:[/]#rm list.bad*
  2. 09:17:02 root@ST-TEST:[/]#time perl -lne 'print if(!/^..........$/)' file > list.bad

  3. real    0m32.77s
  4. user    0m28.18s
  5. sys     0m2.04s
  6. 09:18:13 root@ST-TEST:[/]#time awk '!/^..........$/' file > list.bad2

  7. real    0m23.18s
  8. user    0m19.30s
  9. sys     0m2.05s
  10. 09:19:25 root@ST-TEST:[/]#time sed '/^..........$/d' file > list.bad3

  11. real    0m16.28s
  12. user    0m11.84s
  13. sys     0m2.81s
  14. 09:19:44 root@ST-TEST:[/]#time perl -lne 'print if(!/^..........$/)' file > list.bad4

  15. real    0m33.44s
  16. user    0m28.29s
  17. sys     0m2.04s
  18. 09:20:27 root@ST-TEST:[/]#ls -l list.bad*
  19. -rw-r--r--   1 root     system    345381000 Jun 13 09:18 list.bad
  20. -rw-r--r--   1 root     system    345381000 Jun 13 09:19 list.bad2
  21. -rw-r--r--   1 root     system    345381000 Jun 13 09:19 list.bad3
  22. -rw-r--r--   1 root     system    345381000 Jun 13 09:20 list.bad4
  23. 09:20:38 root@ST-TEST:[/]#
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP