2012-03-15 59 views
0

这是How do I average column values from a tab-separated data file, ignoring a header row and the left column?的后续行动。任务是:打开并阅读文件;到达每一行,将内容分割成数组,并计算数值的平均值;最后将新的文件写入每个包含数值的列的平均值。为什么我在输出文件中看不到计算结果?

所有似乎都很好,直到最后一点。问题是,尽管我可以创建一个新的文件,但.txt文件本身没有在输出中打印的内容。最好,作为Perl的新用户,我宁愿将脚本保留在下面写的样式中,以便更好地理解它。我可能不太适合那些更简洁的版本,可能会在那里。感谢jchips12是相当有帮助的。

不管怎样,代码:从文件Lab1_table.txt

#!/usr/bin/perl -w 
use strict; 
my $infile = "Lab1_table.txt"; # This is the file path 
open INFILE, $infile or die "Can't open $infile: $!"; 
my $outfile = "Lab1_tableoutput.txt"; 
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; 

my $count = 0; 
my @header =(); 
my @average =(); 

while (<INFILE>) { 
    chomp; 
    my @columns = split /\t/; 
    $count++; 
    if ($count == 1) { 
     @header = @columns; 
    } else { 
     for(my $i = 1; $i < scalar @columns; $i++) { 
      $average[$i] += $columns[$i]; 
     } 
    } 
} 

for(my $i = 1; $i < scalar @average; $i++) { 
    print $average[$i]/($count-1), "\n"; 
} 

print OUTFILE "\n"; 
close OUTFILE; 

的数据来如下:

retrovirus  genome gag  pol  env 
HIV-1   9181 1503 3006 2571 
FIV    9474 1353 2993 2571 
KoRV   8431 1566 3384 1980 
GaLV   8088 1563 3498 2058 
PERV   8072 1560 3621 1532 

结果产生正确的平均值,虽然有点杂乱在终端和它们没有被标记为对应于任何列号/名称。此外,还生成了一个.txt文件,但没有输出。

结果出来为:

Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X 
0 
8649.2 
1509 
3300.4 
2142.4 

***Line X: Where X is either 2, 3, 4, 5, or 6.*** 

从这我可以推断“参数”的错误是指5个标题列,并且0与非数值的唯一列。

帮助获取文件写入.txt文件,或者在某种程度上我可以读取命令行中显示的输出将不胜感激。另外,虽然我隐约知道代码的每一步发生了什么,但如果可能的话,我希望能够更深入地了解大多数步骤中正在发生的事情。我仍然在读它,但我希望能够更清楚地理解更多细节。每行

+0

看到我下面的评论。我认为你可以通过使用模式来修复它:\ t +而不是\ t – 2012-03-16 02:18:27

+0

@PkC:看起来,网站管理员已取消我们上次的讨论。如果您发现此评论,则完成的脚本位于[http://derivations.org/acgt.txt]。我的电子邮件(我将很快从这里删除)是gmail dot com的tbtkorg。 – thb 2012-03-18 05:21:34

回答

0

指定的意见,让您清楚的了解

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

my $infile = "Lab1_table.txt";       # input file path 
open INFILE, $infile or die "Can't open $infile: $!"; # input file opened 
my $outfile = "Lab1_tableoutput.txt";     # output file path 
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # output file opened 

my $count = 0;    # count variable to check for header row in file 
my @header =();   # variable to store headers/column names of file 
my @average =();   # variable to store average calculated for each column 

while (<INFILE>) {  
chomp; 
my @columns = split /\s+/; # \s stands for [\ \t\r\n\f] 
$count++;  

if ($count == 1) {   
        @header = @columns;  # executed only once for header 
     } 
else {          # else column executed for remaining rows 
     for(my $i = 1; $i < scalar @columns; $i++) { # $i=1 means skip first column 
       $average[$i] += $columns[$i];  # calcuate average for each row 
      } 
     } 
} 
for(my $i = 1; $i < scalar @average; $i++) {  

    print OUTFILE $average[$i]/($count-1), "\n"; # This will write to output file 

    }  
close OUTFILE; 

使用print OUTFILE $average[$i]/($count-1), "\n";写入文件。

错误Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X可能是您添加的列中的值,任何机会都有字符串而不是数字。请检查您的输入文件。

注意:我没有得到上面的错误.Script运行顺利与上述数据。但是,如果我将其中一个数字更改为字符串,我收到此错误。

+0

可能有2个选项卡将逆转录病毒和基因组(第一和第二)列分开。这将创建另一个列来求和,其值为空字符串“”。这可能是他看到的问题。 – 2012-03-15 20:58:15

+0

他的代码在单个选项卡上拆分,您的代码在\ s + – 2012-03-15 21:05:33

+0

@ ChrisCharley上拆分。数据中没有空格,例如数字/标题名称。因此,我们可以使用'\ s +'作为制表符。如果您希望还可以使用'\ t'。 – 2012-03-16 03:35:06

相关问题