in reply to Analytics on Hash Arrays

Hi Requirements are not clear enough. But I can help you in making prototype of Hash of Arrays from the above data.

#!/usr/bin/perl use strict; use warnings; my $file = "File_Path"; open FH, $file, or die "Can't open $file $!\n"; my %hash = (); while(<FH>){ my @array = split(/ +/, $_); $hash{$array[0]}{$array[1]}{$array[2]} = $array[3]; } print Data::Dumper(%hash); # Hash array created in the format # server01: => {2015-06-23T21:58:05-05:00 => FC_IO_BY_R = #13,550,785}

Now you have a hash with you, if you want to subtract the previous value, you might have to use offset. Might be you have to save previous value in a file or somewhere in database. I hope it helps!!

Replies are listed 'Best First'.
Re^2: Analytics on Hash Arrays
by yasser8@gmail.com (Novice) on Jun 24, 2015 at 14:32 UTC

    Thanks for the help. Let me try to clarify what I am trying to achieve..

    while(<DATA>){ next unless /\w/; my($server,$datetime,$metric,$value) = (split)[0,1,2,3]; my $ddhh = substr $datetime,0,16; my $dd = substr $datetime,0,10; $h{$dd }{$metric}{max} = $value; # How can I assign Maximum val +ue within the group $dd and $metric ? $h{$dd }{$metric}{min} = $value; # How can I assign Maximum val +ue within the group $dd and $metric ? $m{$ddhh }{$metric}{max} = $value; # How can I assign Maximum val +ue within the group $ddhh and $metric ? $m{$ddhh }{$metric}{min} = $value; # How can I assign Maximum val +ue within the group $ddhh and $metric ? }

    I can't use file or database to store, I mean I can't leverage anything outside perl program. My idea my be worst, I am very new to perl, please help..

      See the ternaryconditional operator for one solution.

      $max = ($x < $max) ? $max : $x; # similar for min

      or the postfix if:

      $max = $x if ($x > $max);

      Update: you may also want to pay attention to the initial value if it is not defined. Your min value may always be 0 unless you have minimum values that are less than the default value for undef.

      --MidLifeXis

        Thanks a lot for your excellent idea abouot using Conditional Operator....

        #!/usr/bin/env perl use strict; use warnings; my %h; my %d; my %ser; my %met; my $x=0; while(<DATA>){ next unless /\w/; my($server,$datetime,$metric,$value) = (split)[0,1,2,3]; $value =~ s/,//g ; my $ddhh = substr $datetime,0,13; my $dd = substr $datetime,0,10; $d{$dd }{$server}{$metric}{max} = ($x < $value) ? $value : $x; $d{$dd }{$server}{$metric}{min} = ($x > $value) ? $value : $x ; $h{$ddhh }{$server}{$metric}{max} = ($x < $value) ? $value : $x; $h{$ddhh }{$server}{$metric}{min} = ($x > $value) ? $value : $x ; $ser{$server} = 1; $met{$metric} = 1; } print "Frequency Hour:\ncollectionTime\n\n"; for my $key (sort keys %h){ print "$key "; for my $ser_key (sort keys %ser){ print "$ser_key "; for my $met_key (sort keys %met){ print " $met_key"; printf " %10s", $h{$key}{$ser_key}{$met_key}{max}; print " " +; printf " %10s", $h{$key}{$ser_key}{$met_key}{min}; print " " +; } } print "\n"; } __DATA__ server01: 2015-06-23T21:58:05-05:00 FC_IO_BY_R 13,5 +50,785 MB server01: 2015-06-23T21:58:05-05:00 FC_IO_BY_W 6,89 +2,224 MB server01: 2015-06-23T21:59:05-05:00 FC_IO_BY_R 13,5 +51,835 MB server01: 2015-06-23T21:59:05-05:00 FC_IO_BY_W 6,89 +2,339 MB server01: 2015-06-23T22:00:05-05:00 FC_IO_BY_R 13,5 +52,066 MB server01: 2015-06-23T22:00:05-05:00 FC_IO_BY_W 6,89 +2,433 MB server01: 2015-06-23T22:01:05-05:00 FC_IO_BY_R 13,5 +53,303 MB server01: 2015-06-23T22:01:05-05:00 FC_IO_BY_W 6,89 +2,590 MB server01: 2015-06-23T22:02:05-05:00 FC_IO_BY_R 13,5 +55,006 MB server01: 2015-06-23T22:02:05-05:00 FC_IO_BY_W 6,89 +2,836 MB server01: 2015-06-23T22:03:05-05:00 FC_IO_BY_R 13,5 +56,007 MB server01: 2015-06-23T22:03:05-05:00 FC_IO_BY_W 6,89 +2,961 MB server01: 2015-06-23T22:04:05-05:00 FC_IO_BY_R 13,5 +56,201 MB server01: 2015-06-23T22:04:05-05:00 FC_IO_BY_W 6,89 +3,086 MB server01: 2015-06-23T22:05:05-05:00 FC_IO_BY_R 13,5 +56,408 MB server01: 2015-06-23T22:05:05-05:00 FC_IO_BY_W 6,89 +3,208 MB server02: 2015-06-23T21:58:54-05:00 FC_IO_BY_R 13,4 +70,021 MB server02: 2015-06-23T21:58:54-05:00 FC_IO_BY_W 7,43 +1,544 MB server02: 2015-06-23T21:59:54-05:00 FC_IO_BY_R 13,4 +70,381 MB server02: 2015-06-23T21:59:54-05:00 FC_IO_BY_W 7,43 +1,642 MB server02: 2015-06-23T22:00:54-05:00 FC_IO_BY_R 13,4 +71,003 MB server02: 2015-06-23T22:00:54-05:00 FC_IO_BY_W 7,43 +1,760 MB server02: 2015-06-23T22:01:54-05:00 FC_IO_BY_R 13,4 +71,334 MB server02: 2015-06-23T22:01:54-05:00 FC_IO_BY_W 7,43 +1,980 MB server02: 2015-06-23T22:02:54-05:00 FC_IO_BY_R 13,4 +71,629 MB server02: 2015-06-23T22:02:54-05:00 FC_IO_BY_W 7,43 +2,196 MB server02: 2015-06-23T22:03:54-05:00 FC_IO_BY_R 13,4 +71,947 MB server02: 2015-06-23T22:03:54-05:00 FC_IO_BY_W 7,43 +2,307 MB server02: 2015-06-23T22:04:54-05:00 FC_IO_BY_R 13,4 +72,575 MB server02: 2015-06-23T22:04:54-05:00 FC_IO_BY_W 7,43 +2,418 MB server02: 2015-06-23T22:05:54-05:00 FC_IO_BY_R 13,4 +73,473 MB server02: 2015-06-23T22:05:54-05:00 FC_IO_BY_W 7,43 +2,586 MB

        Maximum values are fine, but as you said I am struck with Minimum values defined, its always getting initialized to 0.

        Could you please help me to come out of it? I mean, is there any way to initialize the actual minimum values?