一次awk脚本的重构
# 脚本功能说明:
# . 检查URL中的域名是否是指定版本的域名
# . 对访问bid,authorid的游客身份排重,并累加其pv
# 全局变量说明
# DOMIAN_LIST 是数组,key是要统计的域名value是域名所属的业务 # 函数参数说明:
# domain 从URL里提取出来的域名
# ver 域名属于哪个业务(wap or touch)
# statid 从URL里提取的出来的bookid或者authorid
# array 用于排重的并累加PV的数组
function compute(domain, ver, statid, userid, array __ARGVEND__)
{
# 提取失败或该域名不在本次处理的业务范围内
if(domain == "" || DOMAIN_LIST[domain] != ver)
{
next # 跳过当前记录的处理,处理下一条记录
} # 提取statid失败
if(statid == )
{
next
} array[statid " " userid]++
next
} {# 记录处理器 url = $
userid = $
session = $ # URL里包含该标志则该URL记录的是用户对wap版书籍的访问记录
if(match(url,/ct=bk&ac=cver&total=wap_book/) > )
{
domain = getMatchDomin(url, DOMAIN_LIST) # 从URL里提取域名,提取失败则为""
userid = choice(userid, session) # 从日志里选择用户身份,userid < 则取session
bid = getBid(url) # 从URL里提取书籍ID compute(domain, "wap", bid, userid, WAP_BOOKS)
} # URL里包含该标志则该URL记录的是用户对wap版作者的访问记录
if(match(url,/ct=bk&ac=zz&total=wap_author/) > )
{
domain = getMatchDomin(url, DOMAIN_LIST) # 从URL里提取域名,提取失败则为""
userid = choice(userid, session) # 从日志里选择用户身份,userid < 则取session
authorid = getAuthorid(url) # 从URL里提取书籍ID compute(domain, "wap", authorid, userid, WAP_AUTHORS)
} # other code ...
}
看起来还不错,但是函数的参数真心的多,一般的编码规范说多于5个和5个以上函数就不容易被使用了(这么说起来win32 api其实也蛮逆天的...)但是这里似乎还好吧,忍了吧,错!这里除了参数多,还有一个问题,就是一旦提取域名失败或者域名不是我们这次要处理的域名,则userid,bid等数据不需要提取,严重的浪费了CPU时间(要知道这些动作得多执行一亿多次)仔细想想,这个函数其实完成了2个事情:检查域名是否有效,累加pv,分成2个函数是不是更好呢?
#检查URL中的域名是否是指定版本的域名
function checkVer(domain, ver, __ARGVEND__)
{
if(domain == "" || DOMAIN_LIST[domain] != ver)
{
next
}
} #对访问bid,authorid的作者排重,并累加pv
function compute(statid, userid, array, __ARGVEND__)
{
if(statid == )
{
next
} array[statid " " userid]++
next
} {# 记录处理器 url = $
userid = $
session = $ # URL里包含该标志则该URL记录的是用户对wap版书籍的访问记录
if(match(url,/ct=bk&ac=cver&total=wap_book/) > )
{
checkVer(getMatchDomin(url, DOMAIN_LIST), "wap") # 检查域名 userid = choice(userid, session)
bid = getBid(url)
compute(bid, userid, WAP_BOOKS)
} # URL里包含该标志则该URL记录的是用户对wap版作者的访问记录
if(match(url,/ct=bk&ac=zz&total=wap_author/) > )
{
checkVer(getMatchDomin(url, DOMAIN_LIST), "wap") userid = choice(userid, session)
authorid = getAuthorid(url)
compute(authorid, userid, WAP_AUTHORS)
}
}
试验了一下,不仅函数参数个数减少了,而且逻辑更通顺,性能也更好,代价就是函数个数增加了,不过看起来这个代价仍然是合算的
更正:
我查了代码大全,代码大全说7个参数才是人类记忆的极限,好吧,不过我认为之前的重构是没有问题的~~~因为好处很明显
一次awk脚本的重构的更多相关文章
- awk脚本
$0,意即所有域. 有两种方式保存shell提示符下awk脚本的输出.最简单的方式是使用输出重定向符号>文件名,下面的例子重定向输出到文件wow. #awk '{print $0}' grade ...
- awk 脚本同时解析多个文件
ARGC The number of command line arguments (does not include options to gawk ...
- 一些我后写出来的awk脚本
mail.awk function mailByShell(receiver, sender, subject, content, __ARGVEND__, xhead, xfrom, xmime, ...
- AWK 脚本编写习惯
教训总结: 不能忽略了脚本语言的编写规范! 创建数组的时候初始化,特别是在for循环中使用的数组: u_count[; g_count[; 认真对待对象,特别是数组的命名: username_to_d ...
- awk脚本使用的几种方法
1. awk名包含在文件内 [root@nhserver1 08]# cat sample.txtaaabbbccc [root@nhserver1 08]# cat readsample.awkaw ...
- 【sed / awk脚本编写】
awk awk分为BEGIN部分,正则匹配部分,END部分三部分. 我一般在BEGIN部分定义一些变量,正则部分用于匹配和执行一些解析和统计,END部分用于输出结果. 总体结构: awk 'BEGIN ...
- 听说awk语言也可以编写脚本
导读 从 awk 系列开始,我们都是在命令行或者脚本文件里写一些简短的 awk 命令和程序.然而 awk 和 shell 一样也是一个解释型语言.通过从开始到现在的一系列的学习,你现在能写可以执行的 ...
- Linux Shell脚本入门--awk命令详解
简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: AWK命令介绍 ...
- shell脚本 awk工具
awk工具概述awk编程语言/数据处理引擎基于模式匹配检查输入文本,逐行处理并输出通常在shell脚本中,或取指定的数据单独用时,可对文本数据做统计 命令格式格式一:awk [选项] '[条件]{编辑 ...
随机推荐
- 用python爬虫抓站的一些技巧总结
1. [代码]最基本的抓站 ? 1 2 import urllib2 content = urllib2.urlopen('http://XXXX').read() 2. [代码]使用代理服务 ...
- 反编译工具 使用.NET JustDecompile来反编译你的程序代码
原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...
- DLL入门浅析(5)——使用DLL在进程间共享数据
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/21/90734.html 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的 ...
- [Design Pattern] Facde Pattern 简单案例
Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...
- Going Home - poj 2195(最小费用流 | 二分匹配)
题目大意:在一个网格里面有n个小男人和n个房子,现在想让每个小男人都有一个房子住,不过每个人移动一下都需要花费¥1,现在求出来最小的总花费.ps:可以认为网格的每个点都是很大的广场并且容纳所有的人,人 ...
- AFNetworking (3.1.0) 源码解析 <二>
这次讲解AFHTTPSessionManager类,按照顺序还是先看.h文件,注释中写到AFHTTPSessionManager是AFURLSessionManager的子类,并且带有方便的HTTP请 ...
- 通过linux ssh远程登录另一台Linux,无需密码,用证书验证
1.首先登入一台linux服务器,此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa 2.在母机上,进入/roo/.ssh目录,找到 ...
- 关于linux内存管理
Linux的内存管理主要分为两部分:物理地址到虚拟地址的映射,内核内存分配管理(主要基于slab). 物理地址到虚拟地址之间的映射 1.概念 物理地址(physical address) 用于内存芯 ...
- Android 网络编程与通信协议
大多数的Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操作, HttpURLConnection和HttpClient.这两种方式都 ...
- yii图片上传
http://wuhai.blog.51cto.com/2023916/953300 首先感谢这里的博主,提供了思路,不过在调用 $model->b_image->extensionNam ...