Chinaunix

标题: 经典pv统计问题的脚本求教,也许早有了,请教! [打印本页]

作者: opiopuiopoi    时间: 2010-05-14 17:43
标题: 经典pv统计问题的脚本求教,也许早有了,请教!
原始日志格式文本如下:
#cat a.lst

10.10.1.1        http://www.hao.com/1.html
10.10.1.2        http://www.hao.com/2.html
10.10.1.3        http://www.hao.com/3.html
10.10.1.4        http://www.hao.com/4.html
10.10.1.2        http://www.hao.com/1.html
10.10.1.1        http://www.hao.com/1.html
10.10.1.1        http://www.hao.com/2.html
10.10.1.2        http://www.hao.com/3.html
10.10.1.1        http://www.hao.com/1.html
10.10.1.3        http://www.hao.com/2.html

求教一shell脚本或perl脚本处理后生成如下报表:

url                                        独立ip                  pv
--------------------------------------------------------------------
http://www.hao.com/1.html        2                4
http://www.hao.com/2.html        3                3
http://www.hao.com/3.html        2                2
http://www.hao.com/4.html        1                1


总结:即通过url计算每个url的独立ip数和pv数,并可按pv数或者独立ip数量进行排序。
作者: lkk2003rty    时间: 2010-05-14 18:04
  1. awk '{if($2 in a){split(a[$2],c," "); c[2]++;if(!match(b[$2],$1)) {c[1]++;b[$2]=b[$2]" "$1;} a[$2]=c[1]" "c[2];} else {a[$2]="1 1";b[$2]=$1}} END{for(i in a)print i,a[i]}' file
复制代码

作者: kwokcn    时间: 2010-05-14 18:24

  1. awk '{a[$2]++;if(!b[$2"_"$1]){b[$2"_"$1]=1;n[$2]++}}END{for(i in a) print i,n[i],a[i]}' URFILE | sort -k3n

  2. # 前面两行在前面直接输出就行了
  3. # 排序用sort处理即可,按独立IP数是-k2n,按pv值是-k3n,如果倒序排就加个r
复制代码

作者: Shell_HAT    时间: 2010-05-14 18:41

  1. awk '!($0 in a){a[$0];a[$2]++}{b[$2]++}END{for(i in b)print i,a[i],b[i]}' urfile | sort
复制代码

作者: yx07004212    时间: 2010-05-15 00:42

  1. awk '{if(!a[$1,$2]++)b[$2]++;c[$2]++}END{for(i in b)print i,b[i],c[i]}' urfile |sort
复制代码

作者: opiopuiopoi    时间: 2010-05-15 16:39
非常感谢楼上各位老大。{:3_200:}
作者: iori809    时间: 2010-05-16 09:24
回复 4# Shell_HAT


    写的真好~同样一个需求,用最简洁的代码实现。这个思路我觉得应该是相对而言非常简洁了~佩服

作者: howge    时间: 2010-05-16 18:15
回复 2# lkk2003rty
翻译下:
awk '{if($2 in a){split(a[$2],c," "); c[2]++;if(!match(b[$2],$1)) {c[1]++;b[$2]=b[$2]" "$1;} a[$2]=c[1]" "c[2];} else {a[$2]="1 1";b[$2]=$1}} END{for(i in a)print i,a}' file

1.先定义个数组a[$2]=“1 1”“1  1”分别代表独立ip个数 和pv值       b[$2]=$1
2.如果网址在数组a里面,将数a[$2]切分分成数组c  c[2]++ 递增,如果这行的ip不重复,c[1]++递增 b[$2] 变成b[url]=url+ip然后a[$2]重新赋值
3.最后遍历
作者: expert1    时间: 2010-05-17 10:18
留个记号看先学习了哦
作者: expert1    时间: 2010-05-17 12:18
回复 4# Shell_HAT


    !($0 in a)

什么意思呢?
作者: Shell_HAT    时间: 2010-05-17 12:56
回复 10# expert1


当前行前面没有出现过,也就是说本行不是重复行。
作者: howge    时间: 2010-05-17 13:33
回复 10# expert1
主要用来去重~~ 就是$0不在数组里面
作者: qinghan1125    时间: 2010-05-17 14:32
mark ※※ learning
作者: kofit    时间: 2010-05-17 16:17
回复 3# kwokcn


    教头,b[$2"_"$1]=1; 这句的作用是什么?
作者: kwokcn    时间: 2010-05-17 16:32
标签,记录URL和IP是否同时出现过。没用$0是考虑到暂时不清楚楼主的文本是否存在分隔符不同的情况,例如有空格有\t。
作者: kofit    时间: 2010-05-17 16:46
回复 15# kwokcn

谢谢~
作者: laohuanggua    时间: 2010-05-17 22:31
回复  kwokcn


    教头,b[$2"_"$1]=1; 这句的作用是什么?
kofit 发表于 2010-05-17 16:17




只有以前没有出现的域名ip组合才到n数组中设置增加,对于出现过的,都在b[$2"_"$1]=1;这一句中设置1了。



话说我也没想出来获取中间列的步骤,也是来学习下的~~~

ps:貌似b[$2_$1]就可以,不需要那个双引号。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2