免费注册 查看新帖 |

Chinaunix

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

经典pv统计问题的perl脚本请教,也许早有了,就是不知道怎么做。 [复制链接]

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-04-02 09:32:18
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-14 17:58 |只看该作者 |倒序浏览
原始日志格式文本如下:
#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数量进行排序。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-05-14 19:52 |只看该作者
这都不会就打算出来混了吗?

自己认认真真学点东西很难吗?

论坛徽章:
0
3 [报告]
发表于 2010-05-14 20:51 |只看该作者
这都不会就打算出来混了吗?

自己认认真真学点东西很难吗?
flw 发表于 2010-05-14 19:52



    老大的意思是很简单吧,我费了半天劲,还没想好如何按ip或pv排序~{:3_186:}
  1. use strict;
  2. use warnings;

  3. my %link;

  4. while(<>){
  5. my($ip,$url)=split;
  6. $link{$url}{$ip}++;
  7. }

  8. open FH,">ippv.txt";

  9. foreach my $kip (keys %link){
  10. my $ip;
  11. my $pv;
  12. my $ref=$link{$kip};
  13. foreach my $kk (keys %{$ref}){
  14. $ip++ if ${$ref}{$kk};
  15. $pv+=${$ref}{$kk};
  16. }
  17. print FH $kip,"\t",$ip,"\t",$pv,"\n";
  18. }

  19. close FH;
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-05-14 21:18 |只看该作者
老大的意思是很简单吧,我费了半天劲,还没想好如何按ip或pv排序~
x9x9 发表于 2010-05-14 20:51

sort 可以排序

论坛徽章:
1
申猴
日期:2014-04-18 16:29:14
5 [报告]
发表于 2010-05-14 23:02 |只看该作者
本帖最后由 Mr-Summer 于 2010-05-14 23:04 编辑

为什么出不来?
  1 open(RH,'a.lst');
  2 my %hash;
  3 while(<RH>)
  4 {
  5         chomp;
  6         ($ip,$url)=split/\s+/,$_;
  7         unless($hash{$url}=[$ip,$count])
  8         {$hash{$url}[$ip]++;}
  9 }      
10 close RH;
11 for $url(keys %hash){
12 print "$url: @{$hash{$url}}\n";
13 }

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
6 [报告]
发表于 2010-05-15 13:08 |只看该作者
  1. my $hash_ref;
  2. my $fina_ref;

  3. while(<DATA>)
  4. {
  5.         chomp;
  6.         my @yy = split;
  7.         $hash_ref->{$yy[1]}->{$yy[0]}++;
  8. }

  9. print Dumper($hash_ref);

  10. foreach my $key1 (keys %$hash_ref)
  11. {
  12.         foreach my $key2 (keys %{$hash_ref->{$key1}})
  13.         {
  14.                 $fina_ref->{$key1}->{ip}++;
  15.                 $fina_ref->{$key1}->{pv} += $hash_ref->{$key1}->{$key2};
  16.         }
  17. }

  18. print Dumper($fina_ref);

  19. print "url                              独立ip           pv\n";
  20. print "----------------------------------------------\n";
  21. foreach my $key (sort{$fina_ref->{$b}->{pv} <=> $fina_ref->{$a}->{pv}} keys %$fina_ref)
  22. {
  23.         print "$key    $fina_ref->{$key}->{ip}  $fina_ref->{$key}->{pv}\n";
  24. }
复制代码
这个是麻烦的,有些东西可以在第一步处理。最后的格式还可以处理一下。

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-04-02 09:32:18
7 [报告]
发表于 2010-05-15 16:38 |只看该作者
非常感谢楼上各位老大,最后还是参考了perl版里的帖子做了:

http://bbs.chinaunix.net/thread-1704515-1-1.html

论坛徽章:
0
8 [报告]
发表于 2010-05-15 19:54 |只看该作者
非常感谢楼上各位老大,最后还是参考了perl版里的帖子做了:
opiopuiopoi 发表于 2010-05-15 16:38



    感觉这问题应该是用sed或AWK更好处理,因为它们对列的处理更容易把握些。

论坛徽章:
0
9 [报告]
发表于 2010-05-15 23:55 |只看该作者
回复 1# opiopuiopoi
  1. #!/usr/bin/perl -w
  2. use strict;
  3. open FILE,"<a.lst" or die "Can not open file tmp_3:$!";
  4. my %pv;
  5. my %ip;
  6. while(<FILE>) {
  7.     chomp;
  8.     my ($ip_2,$url) = split;
  9.     $pv{$url}++;
  10.     push @{$ip{$url}},$ip_2 unless $ip_2 ~~@{$ip{$url}};
  11.     print "ip_2 = $ip_2, ip = @{$ip{$url}}\n";
  12. }
  13. my %reverse_pv = reverse %pv;
  14. for (reverse sort keys %reverse_pv) {
  15.     print "$reverse_pv{$_}   ",scalar @{$ip{$reverse_pv{$_}}},"   $_\n";
  16. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP