更改代码以对来自多个文件的值求和

时间:2012-10-30 16:16:43

标签: arrays perl sum rows

如果我能在这里得到一些帮助,我很好奇。我是一个perl新手,并且无法弄清楚如何将以下代码转换为对我的分析更有用的东西。

此代码目前从用户提供的数据文件列表中获取第1和第4列,并将它们放在一起。

我希望我的代码要做的是,对于此代码生成的“当前输出”的每一行(见下文),将这些第4列值(filea,fileb,filec)的总和。不太确定如何实现这个......

当前输出:

filea   fileb  filec

entrya  | 0 |10.2 | 0
entryb  | 0 | 0.0 | 1     
entryc  | 8 | 57.0| 46       

期望的输出

         sum
entrya | 10.2
entryb | 1
entryc | 111

当前代码如下所示:

main: {


my %data;

foreach my $file (@rsem_files) {

    open (my $fh, $file) or die "Error, cannot open file $file";
    my $header = <$fh>; # ignore it
    while (<$fh>) {
        chomp;
        my @x = split(/\t/);
        my $acc = $x[0];
        my $count = $x[4];
        $data{$acc}->{$file} = $count;
    }
    close $fh;
}

my @filenames = @rsem_files;
foreach my $file (@filenames) {
    $file = basename($file);
}


print join("\t", "", @filenames) . "\n";
foreach my $acc (keys %data) {

    print "$acc";

    foreach my $file (@rsem_files) {

        my $count = $data{$acc}->{$file};
        unless (defined $count) {
            $count = "NA";
        }

        print "\t$count";

    }

    print "\n";

}


exit(0);
}

2 个答案:

答案 0 :(得分:1)

更改@rsemfiles循环:

# create $total variable outside loop
my $total = 0; 
foreach my $file (@rsem_files) {
    my $count = $data{$acc}->{$file};
    # change unless to if, no need for NA
    if (defined $count) {   
        $total += $count;
    }
}
# move print outside loop so it happens once instead of per-file
print '\t$total\n'; 

答案 1 :(得分:0)

foreach $line(@rsemfiles) {
    if ($line=~ /^entry/) {   
    #match the line starting with the word entry
    my $entry=$1; my $filea=$2; my $fileb=$3; my $filec=$4;  
    # make variables out of the column values

现在您已拥有这些变量,您可以对它们进行数学运算。