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