免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1276 | 回复: 0
打印 上一主题 下一主题

[文本处理] 优化一个文本处理脚本的效率 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-21 15:41 |只看该作者 |倒序浏览
8可用积分
·奉上我的所有的可用积分,如果接收赊账的话,50日后给
·需求: 正常情况下三个服务器的“特征码”不会有重复,但是当出错的时候,可能特征数据会出现在两个服务器上。
          特征码据分4段,
          每个服务器有用的行数据如下
          H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
          我们可以找到四个 H'001E28:开头的行,然后列块合并就得到了我们要的特征码, 如第一个块 84588888777766FF
          H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
          H'001E28:......)H'8888:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
          H'001E28:......)H'7777:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
          H'001E28:......)H'66FF:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
         一个服务器上理论数据不重复,所以我用了uniq对每个服务器数据处理,这样也排除了非法数据00000000000FFFF的占比

所以需求:
        1, 优化下面效率,给出来的东西希望有注解,我是新手
        2, 比较高的效率算出三个服务器之间的三角重叠关系,以及三个服务器都出现了一个特征码的情况,我下面代码没有考虑的这个状况

  1. #!/usr/bin/bash

  2. ###删除无关文件清屏
  3. echo -e "\e[2J\e[1;1H"
  4. rm -f full.log
  5. rm -f uniq.log
  6. rm -f *list
  7. rm -f orig
  8. rm -f cut*
  9. rm -f merge
  10. rm -f server


  11. ###开始处理文件,文件通常3个,单个文件中有效数据为300000行,有效数据格式如下,为72 (72*2字节), 为8个特征码的1/4部分数据
  12. ###H'001E28:......)H'8458:H'5458:H'5458:H'8458:H'8458:H'3458:H'8458:H'5458:
  13. ### 少量异常的行会出现两行出现在一行,需要在73字节处做换行,让多出来的部分变成下一行

  14. for varfile in *.log
  15. do

  16. ###处理文件为300000 * 72 的有效文件
  17.                                 cat $varfile | egrep "\.{6}" | sed 's/^.{72}/&\n/' | sed  '/^$/d' > orig
  18. ###判断文件有效性
  19.                                 file_length=$(cat orig |wc -l)
  20.                                 if [ "$file_length" != 300000 ]; then
  21.                                 echo "$varfile is corrupted, get a new one or contact Koomier"
  22.                                 echo -e "byebye, I am free now and you got work to do\a"
  23.                                 exit 0
  24.                                 else
  25.                                 echo "$varfile: $file_length line"
  26.                                 echo "Kimi is fighting..."
  27.                                 echo "..."
  28. ###分割文件, 将文件按行切割成 75000 * 72的四个有效文件,然后粘贴按列文件75000 * (72*4)的文件
  29.     sed -n '1,75000p' orig | sed 's/\r\n/\n/' > cut1
  30.     sed -n '75001,150000p' orig | sed 's/\r\n/\n/' > cut2
  31.     sed -n '150001,225000p' orig | sed 's/\r\n/\n/' > cut3
  32.     sed -n '225001,300000p' orig | sed 's/\r\n/\n/' > cut4
  33.     paste -d "" cut1 cut2 cut3 cut4 > merge

  34. ###对文件切割,一个特征码由第一个四位数字(如H'8458)以及他相隔72*i (i=1,2,3)组成一个特征码, 一行共含有 8 * 8 个特征码, 对得到的所有特征码去重
  35.     cat merge |cut -b 19-22,91-94,163-166,235-238 > server
  36.     cat merge |cut -b 26-29,98-101,170-173,242-245 >> server
  37.     cat merge |cut -b 33-36,105-108,177-180,249-252 >>server
  38.     cat merge |cut -b 40-43,112-115,184-187,256-259 >>server
  39.     cat merge |cut -b 47-50,119-122,191-194,263-266 >>server
  40.     cat merge |cut -b 54-57,126-129,198-201,270-273 >>server
  41.     cat merge |cut -b 61-64,133-136,205-208,277-280 >>server
  42.     cat merge |cut -b 68-71,140-143,212-215,284-287 >>server
  43.     cat server | sort | uniq > ${varfile}_list
  44.     rm orig
  45.     rm cut*
  46.     rm merge
  47.     rm server
  48.     fi
  49. done
  50. echo -e "End.."
  51. ###将三个文件处理得到的特征码放到一个总表中,排序, 去重,从而得到总特征码数量,以及真实数量,和重复数量
  52. cat *list | sort | tee full.log | uniq > uniq.log
  53. full_length=$(cat full.log |wc -l)
  54. echo "Sum of phone numbers: $full_length"
  55. uniq_length=$(cat uniq.log |wc -l)
  56. echo "Acutal Users: $uniq_length"
  57. declare -i gap = $full_length-$uniq_length
  58. echo "Delta: $gap"
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP