1

好奇我能不能在这里得到一点帮助。我是 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);
}
4

2 回答 2

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'; 
于 2012-10-30T16:26:48.643 回答
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

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

于 2012-10-30T17:39:32.157 回答