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 に答える