我是 perl 的新手,我想阅读一个表格并对特定行的一些值求和。这是我的输入文件的简化示例:
输入 :
Gene Size Feature
GeneA 1200 Intron 1
GeneB 100 Intron 1
GeneB 200 Intron 1
GeneB 150 Intron 2
GeneC 300 Intron 5
输出 :
GeneA 1200 Intron 1
GeneB 300 Intron 1 <-- the size values are summed
GeneB 150 Intron 2
GeneC 300 Intron 5
因为基因 B 存在于具有两种不同大小的内含子 1,所以我想将这两个值相加,并且每个内含子编号只打印一行。
这是我想做的代码示例。但如果我能理解如何处理这种数据,我想让它变得更复杂。
#!/usr/bin/perl
use strict;
use warnings;
my $sum;
my @GAP_list;
my $prevline = 'na';
open INFILE,"Table.csv";
while (my $ligne = <INFILE>)
{
chomp ($ligne);
my @list = split /\t/, $ligne;
my $gene= $list[0];
my $GAP_size= $list[2];
my $intron= $list[3];
my $intron_number=$list[4];
if($prevline eq 'na'){
push @GAP_list, $GAP_size;
}
elsif($prevline ne 'na') {
my @list_p = split /\t/,$prevline;
my $gene_p= $list_p[0];
my $GAP_size_p= $list_p[2];
my $intron_p= $list_p[3];
my $intron_number_p=$list_p[4];
if (($gene eq $gene_p) && ($intron eq $intron_p) && ($intron_number eq $intron_number_p)){
push @GAP_list, $GAP_size;
}
}
else{
$sum = doSum(@GAP_list);
print "$gene\tGAP\t$GAP_size\t$intron\t$intron_number\t$sum\n";
$prevline=$ligne;
}
}
# Subroutine
sub doSum {
my $sum = 0;
foreach my $x (@_) {
$sum += $x;
}
return $sum;
}