#!/usr/bin/perl use strict; use warnings; use Getopt::Std; my %opt; get_args(\%opt); my $desired = load_date_file($opt{d}); open(my $fh, '<', $opt{i}) or die "Unable to open '$opt{i}' for reading: $!"; while (<$fh>) { chomp; my ($id, $date, $val) = split ' ', $_, 3; next if ! defined $date || ! exists $desired->{$date}; $desired->{$date}{sum} += $val; $desired->{$date}{cnt}++; } for my $date (sort keys %desired) { my $sum = $desired->{$date}{sum} || 0; my $cnt = $desired->{$date} || 0; my $avg = $cnt ? sprintf('%.2f', $sum / $cnt) : 0; print join(',', $date, $sum, $cnt, $avg), "\n"; } sub load_date_file { my ($file) = @_; my %desired; open(my $fh, '<', $file) or die "Unable to open '$file' for reading: $!"; while (<$fh>) { chomp; if (! /^\d{4}$/) { warn "'$_' is not in MMYY format - skipping\n"; next; } $desired{$_} = undef; } return \%desired; } sub get_args { my ($opt) = @_; my $Usage = qq{Usage: $0 -d -i -h : This help message -d : The (d)ate file -i : The (i)nput file } . "\n"; getopts('hd:i:', $opt) or die $Usage; die $Usage if $opt->{h} || ! defined $opt->{d} || ! defined $opt->{i}; }