On 8/23/07, Kirk Wythers <[EMAIL PROTECTED]> wrote:
> Sorry for the "not sure where to even begin" nature of this email,
> but I am stuck. I am trying to put together a aggregating script that
> takes daily climate data and produces monthly averages. For example,
> the input file has the form:
>
> year month doy tmax tmin par precip NH4 NO3 O3 CO2
> V1 V2 V3 V4
> 1949 1 1 0 -2.78 440.16 0 0 0 0
> 0 0 0 0 0
> 1949 1 2 0.56 -6.67 501.21 0 0 0 0
> 0 0 0 0 0
> 1949 1 3 -1.11 -9.44 374.2 0 0 0 0
> 0 0 0 0 0
> 1949 1 4 1.67 -3.89 180.04 0.03 0 0 0
> 0 0 0 0 0
> 1949 1 5 3.89 -11.11 225.07 0.33 0 0 0
> 0 0 0 0 0
> 1949 1 6 3.33 -11.67 190.57 0 0 0 0
> 0 0 0 0 0
> 1949 1 7 8.89 1.67 358.3 0 0 0 0
> 0 0 0 0 0
> 1949 1 8 2.78 -1.11 447.57 0 0 0 0
> 0 0 0 0 0
> 1949 1 9 1.11 -6.67 185.17 0 0 0 0
> 0 0 0 0 0
> 1949 1 10 -6.11 -8.33 402.95 0.03 0 0 0
> 0 0 0 0 0
> 1949 1 11 -2.78 -7.78 438.61 0 0 0 0
> 0 0 0 0 0
> 1949 1 12 -2.22 -6.67 197.34 0 0 0 0
> 0 0 0 0 0
> 1949 1 13 0 -3.89 194.77 0 0 0 0
> 0 0 0 0 0
> 1949 1 14 -1.11 -3.89 428.67 0 0 0 0
> 0 0 0 0 0
> 1949 1 15 5.56 -1.11 196.74 0.61 0 0 0
> 0 0 0 0 0
> 1949 1 16 5.56 -6.67 198.01 0.05 0 0 0
> 0 0 0 0 0
> 1949 1 17 -5.56 -7.78 403.66 0.1 0 0 0
> 0 0 0 0 0
> 1949 1 18 -3.89 -11.67 205.6 0.3 0 0 0
> 0 0 0 0 0
> 1949 1 19 -3.89 -16.11 217.64 0.33 0 0 0
> 0 0 0 0 0
> 1949 1 20 -10 -16.67 477.62 0.03 0 0 0
> 0 0 0 0 0
> 1949 1 21 -1.67 -10 213.43 0.13 0 0 0
> 0 0 0 0 0
> 1949 1 22 -6.11 -10.56 514.38 0.03 0 0 0
> 0 0 0 0 0
> 1949 1 23 -3.33 -8.33 221.18 1.14 0 0 0
> 0 0 0 0 0
> 1949 1 24 -1.11 -6.67 222.15 0.33 0 0 0
> 0 0 0 0 0
> 1949 1 25 -6.67 -11.11 366.21 0.08 0 0 0
> 0 0 0 0 0
> 1949 1 26 -3.89 -11.11 353.45 0.1 0 0 0
> 0 0 0 0 0
> 1949 1 27 -1.67 -6.67 230.49 0 0 0 0
> 0 0 0 0 0
> 1949 1 28 -2.78 -14.44 369.51 1.73 0 0 0
> 0 0 0 0 0
> 1949 1 29 -13.33 -19.44 324.27 0 0 0 0
> 0 0 0 0 0
> 1949 1 30 -6.11 -18.33 479.95 0 0 0 0
> 0 0 0 0 0
> 1949 1 31 -6.11 -16.67 455.25 0.03 0 0 0
> 0 0 0 0 0
> 1949 2 32 -6.67 -15 508.9 0 0 0 0
> 0 0 0 0 0
> 1949 2 33 -10.56 -18.89 709.76 0 0 0 0
> 0 0 0 0 0
> 1949 2 34 -6.11 -13.89 253.29 0.05 0 0 0
> 0 0 0 0 0
> 1949 2 35 -3.33 -7.22 411 0.28 0 0 0
> 0 0 0 0 0
> 1949 2 36 -2.78 -12.22 489.31 0 0 0 0
> 0 0 0 0 0
>
> I need to step through 50 years of data, returning a single line of
> monthly averages. SOmething like:
>
> year month doy tmax tmin par precip NH4
> NO3 O3 CO2 V1 V2 V3 V4
> 1949 1 15 5.45 -3.1 346 1.3
> 0 0 0 0 0 0
> 0 0
> 1949 2 61 4.6 1.2 421
> 2.1 0 0 0 0 0
> 0 0 0
>
> etc....
>
> So far I can not seem to get past reading in the data and printing it
> out with something like:
>
> #! /usr/bin/perl -w
> use strict;
>
> $, = ' '; # set output field separator
> $\ = "\n"; # set output record separator
>
> my %days = map +($_, 1),
> qw/ 15 46 76 107 137 168 229 259 290 321 351 /;
>
> while (<>) {
> my @data = split;
> print @data;
> }
>
>
> Thanks in advance
>
>
>
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> http://learn.perl.org/
>
>
>
assuming your data is sorted this should work
#!/usr/bin/perl
use strict;
use warnings;
my @key = qw<year month>;
my @head = (@key, 'doy');
my @sum = qw<tmax tmin par precip NH4 NO3 O3 CO2 V1 V2 V3 V4>;
my @fields = (@head, @sum);
my $fmt = "%4d %4d %10.2f %8.2f %8.2f %5.2f %4d %7d %7d %7d %7d %7d
%7d %7d\n";
my $old;
my $n;
my %store;
my $average = sub {
$store{$_} /= $n for @sum;
printf $fmt, @[EMAIL PROTECTED], @sum};
$n = 0;
@[EMAIL PROTECTED] = ('') x @head;
@[EMAIL PROTECTED] = (0) x @sum;
};
while (<DATA>) {
chomp;
my %rec;
@[EMAIL PROTECTED] = split;
my $cur = "@[EMAIL PROTECTED]";
$average->() if defined $old and $old ne $cur;
$old = $cur;
@[EMAIL PROTECTED] = @[EMAIL PROTECTED];
$store{$_} += $rec{$_} for @sum;
$n++;
}
$average->();
__DATA__
1949 1 1 0 -2.78 440.16 0 0 0
0 0 0 0 0 0
1949 1 2 0.56 -6.67 501.21 0 0 0
0 0 0 0 0 0
1949 1 3 -1.11 -9.44 374.2 0 0 0
0 0 0 0 0 0
1949 1 4 1.67 -3.89 180.04 0.03 0 0
0 0 0 0 0 0
1949 1 5 3.89 -11.11 225.07 0.33 0 0
0 0 0 0 0 0
1949 1 6 3.33 -11.67 190.57 0 0 0
0 0 0 0 0 0
1949 1 7 8.89 1.67 358.3 0 0 0
0 0 0 0 0 0
1949 1 8 2.78 -1.11 447.57 0 0 0
0 0 0 0 0 0
1949 1 9 1.11 -6.67 185.17 0 0 0
0 0 0 0 0 0
1949 1 10 -6.11 -8.33 402.95 0.03 0 0
0 0 0 0 0 0
1949 1 11 -2.78 -7.78 438.61 0 0 0
0 0 0 0 0 0
1949 1 12 -2.22 -6.67 197.34 0 0 0
0 0 0 0 0 0
1949 1 13 0 -3.89 194.77 0 0 0
0 0 0 0 0 0
1949 1 14 -1.11 -3.89 428.67 0 0 0
0 0 0 0 0 0
1949 1 15 5.56 -1.11 196.74 0.61 0 0
0 0 0 0 0 0
1949 1 16 5.56 -6.67 198.01 0.05 0 0
0 0 0 0 0 0
1949 1 17 -5.56 -7.78 403.66 0.1 0 0
0 0 0 0 0 0
1949 1 18 -3.89 -11.67 205.6 0.3 0 0
0 0 0 0 0 0
1949 1 19 -3.89 -16.11 217.64 0.33 0 0
0 0 0 0 0 0
1949 1 20 -10 -16.67 477.62 0.03 0 0
0 0 0 0 0 0
1949 1 21 -1.67 -10 213.43 0.13 0 0
0 0 0 0 0 0
1949 1 22 -6.11 -10.56 514.38 0.03 0 0
0 0 0 0 0 0
1949 1 23 -3.33 -8.33 221.18 1.14 0 0
0 0 0 0 0 0
1949 1 24 -1.11 -6.67 222.15 0.33 0 0
0 0 0 0 0 0
1949 1 25 -6.67 -11.11 366.21 0.08 0 0
0 0 0 0 0 0
1949 1 26 -3.89 -11.11 353.45 0.1 0 0
0 0 0 0 0 0
1949 1 27 -1.67 -6.67 230.49 0 0 0
0 0 0 0 0 0
1949 1 28 -2.78 -14.44 369.51 1.73 0 0
0 0 0 0 0 0
1949 1 29 -13.33 -19.44 324.27 0 0 0
0 0 0 0 0 0
1949 1 30 -6.11 -18.33 479.95 0 0 0
0 0 0 0 0 0
1949 1 31 -6.11 -16.67 455.25 0.03 0 0
0 0 0 0 0 0
1949 2 32 -6.67 -15 508.9 0 0 0
0 0 0 0 0 0
1949 2 33 -10.56 -18.89 709.76 0 0 0
0 0 0 0 0 0
1949 2 34 -6.11 -13.89 253.29 0.05 0 0
0 0 0 0 0 0
1949 2 35 -3.33 -7.22 411 0.28 0 0
0 0 0 0 0 0
1949 2 36 -2.78 -12.22 489.31 0 0 0
0 0 0 0 0 0
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/