免费注册 查看新帖 |

Chinaunix

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

新手求助 小程序组合在一起 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-12-27 15:19 |只看该作者
回复 10# xiumu2280
在小骆驼上看到glob操作符,取得当前目录所有文件。但是后面怎么依次处理计算就懵了。感觉脑筋不够似的。。
实践的太少,得继续研究啊。。。

   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
12 [报告]
发表于 2013-12-27 15:19 |只看该作者
写第六个程序·
这个思路不错~
谢谢了小伙伴们。{:2_172:}
回复 5# xiumu2280


   

论坛徽章:
0
13 [报告]
发表于 2013-12-27 15:23 |只看该作者
回复 9# pitonas
小骆驼都没读明白呢,,程序都是看例子自个儿改的。。。。

   

论坛徽章:
1
处女座
日期:2014-03-28 10:11:00
14 [报告]
发表于 2013-12-27 17:33 |只看该作者
本帖最后由 rongchaogao 于 2013-12-27 19:54 编辑
  1. use strict;
  2. use warnings;

  3. my        $out_out1 = "result.txt";
  4. open  my $out1, '>', $out_out1 or die  "Fail open $out_out1\n";
  5. print $out1 "Date\tserver\tgini\n";

  6. my (%hash,%freq,%amout,);

  7. my @files=glob "*.log";

  8. foreach my $file (@files)
  9. {
  10.         $file=~m/_(\d{4})(\d{2})(\d{2})/;
  11.         my $data="$1-$2-$3";
  12.         my        $in_in = "$file";
  13.         open  my $in, '<', $in_in or die "Fail open $in_in file\n";
  14.         while(<$in>)
  15.         {
  16.                 chomp;
  17.                 my @array=split /\|/;
  18.                 if($array[6]==15 or $array[6]==16)
  19.                 {
  20.                         $hash{$array[2]}{$array[5]}{$array[9]}=1;
  21.                 }
  22.                 else
  23.                 {
  24.                         next;
  25.                 }
  26.         }
  27.         foreach my $key1 (sort {$a<=>$b} keys %hash)
  28.         {
  29.                 foreach my $key2 (sort {$a<=>$b} keys %{$hash{$key1}})
  30.                 {
  31.                         foreach my $key3 (sort {$a<=>$b} keys %{$hash{$key1}{$key2}})
  32.                         {
  33.                                 $freq{$key1}{$key2}++;
  34.                                 $amout{$key1}{$key2}+=$key3;
  35.                         }
  36.                 }
  37.         }
  38.         foreach my $key1 (sort {$a<=>$b} keys %freq)
  39.         {
  40.                 my @origx=qw//;;
  41.                 foreach my $key2 (sort {$b<=>$a} keys %{$freq{$key1}})
  42.                 {
  43.                         push @origx,$amout{$key1}{$key2};
  44.                 }
  45.                 my $gini=calc_gini(\@origx,$data,$key1)
  46.         }
  47.        
  48.         undef %hash;
  49.         undef %freq;
  50.         undef %amout;
  51.         close $in;
  52. }
  53. close  $out1;
  54.        
  55. sub calc_gini
  56. {
  57.         my $ginisum=0;
  58.         my $sum=0;
  59.         my $cout=@{$_[0]};
  60.         for (my $i=1;$i<=$cout;$i++)
  61.         {
  62.                 $ginisum=$ginisum+(2*$i-$cout-1)*$_[0]->[$i-1];
  63.                 $sum=$sum+$_[0]->[$i-1];
  64.         }
  65.         my $gini=$ginisum/($cout-1)/$sum;
  66.         print $out1 "$_[1]\t$_[2]\t$gini\n";
  67. }
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
15 [报告]
发表于 2013-12-27 17:43 |只看该作者
本帖最后由 pitonas 于 2013-12-29 06:34 编辑

小伙伴们,提问题?  需求 目标都要清楚 ~{:2_171:}

代码这麽多的错误,无法从你的错误代码猜出来你的目标,
囧。{:2_176:}

大概就是这样了
真心不会了,折腾了一下午,怎么都搞不好....{:2_169:}
  1. open my $F, "equ.txt" or die "error: $!";
  2. my @equ;
  3. while (<$F>) {
  4.     chomp;
  5.     my @array = split /\|/;
  6.     if ( $array[6] == 15 or $array[6] == 16 ) {
  7.         push @equ, [ @array[ 2, 5, 9 ] ];
  8.     }
  9. }

  10. @equ = map { [ @{$_}[ 1, 2 ] ] }
  11.        sort { $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] }
  12.        grep { $_->[0] == 0 } @equ;

  13. my %amount;

  14. $amount{ $_->[0] } += $_->[1] for @equ;

  15. @equ = sort { $amount{$a} <=> $amount{$b} } keys %amount;

  16. sub calc_gini {
  17.     my @x = @_;
  18.     my ( $ginisum, $sum ) = ( 0, 0 );
  19.     for my $i ( 1 .. @x ) {
  20.         $ginisum += ( 2 * $i - @x - 1 ) * $x[ $i - 1 ];
  21.         $sum += $x[ $i - 1 ];
  22.     }
  23.     $ginisum / $#x / $sum;
  24. }

  25. my $gini = calc_gini(@equ);
  26. print "$gini\n";
复制代码
回复 11# ljw0316


   

论坛徽章:
0
16 [报告]
发表于 2013-12-27 17:49 |只看该作者
回复 14# rongchaogao
第一反应是 感激呀
我好好尝试下,灰常感谢

   

论坛徽章:
0
17 [报告]
发表于 2013-12-27 17:55 |只看该作者
回复 15# pitonas
先谢谢下伙伴,可能是我表述不好。目标就是每天每个服务器的基尼系数,其他都不需要。
其实数据就是每一天的日志文件,一天一个log文件,每个文件包含所有服务器的信息。
如果您有兴趣不妨加QQ401939231 共同探讨,不胜感谢!

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP