The Other1 wrote:
> Hi all,
Hello,
> Sorta newbie here...
>
> I have parsed log files and have an array of arrays that looks like this:
>
> [...]
> 1 0.0 0.000 31.954 36.169 12.645 20:40
> 16 1048.0 16.196 15.825 52.502 5.150 20:40
> 8 1281.7 12.059 9.634 41.264 4.869 20:40
> 9 1157.7 19.094 16.889 52.218 4.742 20:40
> 0 0.0 0.000 76.430 109.366 7.179 20:50
> 0 203.3 7.029 35.411 65.495 10.142 20:50
> 0 167.5 8.476 51.829 78.884 24.049 20:50
> 0 135.3 4.371 33.088 54.554 16.763 20:50
> 2 0.0 0.000 22.612 23.297 13.714 21:00
> 5 260.0 5.233 20.610 46.264 9.826 21:00
> 0 242.3 7.003 29.601 56.070 8.485 21:00
> 0 227.3 5.954 26.831 50.991 10.794 21:00
> 0 0.0 0.000 28.523 56.333 10.554 21:10
> 0 146.9 4.573 31.879 61.403 10.197 21:10
> 0 151.4 4.330 29.295 54.513 11.121 21:10
> 0 134.6 3.911 29.753 57.781 10.771 21:10
> [...]
>
> 7 values in each row. 4 rows represent 1 data set. I need to get an
> avearge for each of the values in the first 6 columns and 4 rows each.
> The last value is a timestamp so I don't need an average on that. So
> for every 4 rows, I need to end up with 1 row of 7 numbers, the first 6
> being averages and the 7th being the time.
>
> I have a subfunction, Average, defined like this:
> sub Average {
> my ($Sum,$Average) = 0;
> foreach my $item (@_) {
> $Sum += $item;
> }
> my $Average = ($Sum / 4);
> return $Average;
> }
>
> My question is how to walk through the array grabbing column 1 of four
> rows, pass those values to the Average function (or if there is a beter
> way, I am open to it!), store the average to be used by GD later, then
> do the next column, etc, up to column 6, then move on to next 4 rows.
> Any help is much appreciated! Thanx!
This appears to do what you want:
use warnings;
use strict;
my @data = map [ split ], <DATA>;
my $data_set = 4;
sub get_average {
my @average;
for my $row ( @_ ) {
for my $column ( 0 .. $#$row ) {
if ( $row->[ $column ] =~ /^[\d.+-]+$/ ) {
$average[ $column ] += $row->[ $column ];
}
else {
$average[ $column ] = $row->[ $column ];
}
}
}
for my $column ( @average ) {
if ( $column =~ /^[\d.+-]+$/ ) {
$column /= $data_set;
}
}
return @average;
}
for ( my $index = 0; $index + $data_set <= @data; $index += $data_set ) {
for ( @data[ $index .. $index + $data_set - 1 ] ) {
print "@$_\n";
}
my @average = get_average @data[ $index .. $index + $data_set - 1 ];
print '-' x 50, "[EMAIL PROTECTED]", '-' x 50, "\n";
}
__DATA__
1 0.0 0.000 31.954 36.169 12.645 20:40
16 1048.0 16.196 15.825 52.502 5.150 20:40
8 1281.7 12.059 9.634 41.264 4.869 20:40
9 1157.7 19.094 16.889 52.218 4.742 20:40
0 0.0 0.000 76.430 109.366 7.179 20:50
0 203.3 7.029 35.411 65.495 10.142 20:50
0 167.5 8.476 51.829 78.884 24.049 20:50
0 135.3 4.371 33.088 54.554 16.763 20:50
2 0.0 0.000 22.612 23.297 13.714 21:00
5 260.0 5.233 20.610 46.264 9.826 21:00
0 242.3 7.003 29.601 56.070 8.485 21:00
0 227.3 5.954 26.831 50.991 10.794 21:00
0 0.0 0.000 28.523 56.333 10.554 21:10
0 146.9 4.573 31.879 61.403 10.197 21:10
0 151.4 4.330 29.295 54.513 11.121 21:10
0 134.6 3.911 29.753 57.781 10.771 21:10
John
--
use Perl;
program
fulfillment
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>