标签

2016年3月29日星期二

Perl: Combine rows

1. Combine rows

#!/usr/bin/perl -w
##########################################################################################
#Goal:combine 1st column and count max, min and mean values for each following columns
##########################################################################################
use strict;
use Data::Dumper;
use List::Util qw/max min sum/;

my (%rec, $key, @vals);

while (<DATA>) {
    chomp;
    ($key, @vals) = split;
    while (my ($i, $v) = each @vals) {
        push @{$rec{$key}->[$i]}, $v;
    }
}
print Dumper (\%rec);

while (my ($key, $vals) = each %rec) { #while & each to go through %hash 
    print $key, "\t";
    while (my ($i, $v) = each @vals) { #while & each to go through @array 
        my $max = max @{$rec{$key}->[$i]};
        my $min = min @{$rec{$key}->[$i]};
        my $sum = sum @{$rec{$key}->[$i]};
        my $n = @{$rec{$key}->[$i]};
        my $mean = $sum / $n;
        # 以下改变内部变量;
        $rec{$key}->[$i][0] = $max; # 求最大值;
        $rec{$key}->[$i][1] = $min; # 求最小值;
        $rec{$key}->[$i][2] = $mean; # 求平均值;
        print $rec{$key}->[$i][0]."/";
        print $rec{$key}->[$i][1]."/";
        print $rec{$key}->[$i][2]."\t";
    }
    print "\n";
}


__DATA__
a   2   3   1   3   2   2
s   2   2   2   2   2   3
s   1   2   3   1   2   1
b   3   2   2   1   5   2
a   2   3   3   5   2   4
s   6   8   4   9   2   5

Output:

$VAR1 = {
          'a' => [
                   [
                     '2',
                     '2'
                   ],
                   [
                     '3',
                     '3'
                   ],
                   [
                     '1',
                     '3'
                   ],
                   [
                     '3',
                     '5'
                   ],
                   [
                     '2',
                     '2'
                   ],
                   [
                     '2',
                     '4'
                   ]
                 ],
          'b' => [
                   [
                     '3'
                   ],
                   [
                     '2'
                   ],
                   [
                     '2'
                   ],
                   [
                     '1'
                   ],
                   [
                     '5'
                   ],
                   [
                     '2'
                   ]
                 ],
          's' => [
                   [
                     '2',
                     '1',
                     '6'
                   ],
                   [
                     '2',
                     '2',
                     '8'
                   ],
                   [
                     '2',
                     '3',
                     '4'
                   ],
                   [
                     '2',
                     '1',
                     '9'
                   ],
                   [
                     '2',
                     '2',
                     '2'
                   ],
                   [
                     '3',
                     '1',
                     '5'
                   ]
                 ]
        };
a 2/2/2 3/3/3 3/1/2 5/3/4 2/2/2 4/2/3 
b 3/3/3 2/2/2 2/2/2 1/1/1 5/5/5 2/2/2 
s 6/1/3 8/2/4 4/2/3 9/1/4 2/2/2 5/1/3 

没有评论:

发表评论