这是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.***
由此我可以推断出“Argument”错误指的是5个标题列,而0
指的是唯一具有非数字值的列。
帮助将文件写入.txt
文件,或者以某种方式我可以读取命令行中显示的输出将非常感激。此外,虽然我隐约知道代码的每一步发生了什么,但如果可能的话,我会更加深入了解大多数步骤中发生的事情。我还在读它,但是我希望能够清楚地理解更精细的细节。
答案 0 :(得分: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
可能是您正在添加的列中的值,任何机会都有字符串而不是数字。检查您的输入文件。
注意:我没有达到错误。上面的数据运行顺畅。但是如果我将数字中的一个更改为字符串,我会收到此错误。