【问题标题】:Why do I see no computed results in my output file?为什么我在输出文件中看不到计算结果?
【发布时间】:2012-03-31 18:40:16
【问题描述】:

这是How do I average column values from a tab-separated data file, ignoring a header row and the left column? 的后续行动。任务是:打开并读取文件;到达每一行,将内容拆分为一个数组,并计算数值的平均值;最后将包含数值的每一列的平均值写入一个新文件。

直到最后一点,一切似乎都很好。问题是,虽然我可以创建一个新的.txt 文件,但.txt 文件本身并没有输出中打印的内容。作为 Perl 的新用户,我更愿意将脚本保持为下面编写的样式,以便更好地理解它。我对可能存在的更简洁的版本不太满意。感谢 jchips12 提供了很大帮助。

反正代码是:

#!/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;

数据来自文件Lab1_table.txt,如下:

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 文件,或者以某种方式我可以读取命令行中显示的输出,将不胜感激。此外,虽然我模糊地知道代码的每个步骤发生了什么,但如果可能的话,我希望能更深入地了解大多数步骤中发生的事情。我还在读,但更精细的细节我希望能够清楚地理解。

【问题讨论】:

  • 在下面查看我的评论。我认为您可以使用以下模式修复它: \t+ 而不是 \t
  • @PkC:网站版主好像取消了我们上次的讨论。如果您找到此评论,则完整的脚本位于 [derivations.org/acgt.txt]。我的电子邮件(我将很快从这里删除)是 tbtkorg at gmail dot com。

标签: perl average


【解决方案1】:

为每一行指定cmets,让你清楚了解

#!/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, &lt;INFILE&gt; line X 可能是如果您要添加的列中的值很可能包含字符串而不是数字。请检查您的输入文件。

注意:我没有遇到上述错误。使用上述数据,脚本运行平稳。但是,如果我将其中一个数字更改为字符串,我会收到此错误。

【讨论】:

  • 可能有 2 个标签将逆转录病毒和基因组(第一和第二)列分开。这将创建另一列来求和,其值为空字符串“”。这可能是他看到的问题。
  • 他的代码在一个标签上拆分,您的代码在 \s+ 上拆分
  • @ChrisCharley- 数据中没有空格,即数字/标题名称。因此我们可以将\s+ 用于制表符。如果您愿意,也可以使用\t
猜你喜欢
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多