标签

2017年1月31日星期二

Perl: Combine columns

1. combine columns according column names

#!/usr/bin/perl -w
use strict;

my (@name, @A, @B, @all);

@name = split /\s+/, <DATA>; # skip first line;
print "$name[0]\tA\tB\n";

for (0 .. $#name) {
    push(@A, $_), next if $name[$_] =~ /^A/; # save array indices;
    push(@B, $_), next if $name[$_] =~ /^B/;
}

while (<DATA>) {
    chomp;
    @all = split;
    my $A_start = $A[0];
    my $A_end = $A[-1];
    my $A_sum = 0;
    map {$A_sum += $_} @all[$A_start..$A_end];
    my $A_mean = $A_sum/@A;
    print "$all[0]\t$A_mean\t";
    
    my $B_start = $B[0];
    my $B_end = $B[-1];
    my $B_sum = 0;
    map {$B_sum += $_} @all[$B_start..$B_end];
    my $B_mean = $B_sum/@B;
    print "$B_mean\n";
}


__DATA__
name A1  A2  A3  B1  B2  B3  B4  ……
a    1   2   3   4   4   4   8   ……
b    6   3   9   12  16  12  32  ……
c    9   33  12  16  20  24  24  ……
d    9   9   15  28  24  16  32  ……

Output:

name A B
a 2 5
b 6 18
c 18 21
d 11 25