gpt4 book ai didi

perl - 如何从制表符分隔的数据文件中平均列值,忽略标题行和左列?

转载 作者:行者123 更新时间:2023-12-02 02:17:49 35 4
gpt4 key购买 nike

我的任务是根据以下名为 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

我必须编写一个脚本来打开和读取这个文件,通过将内容拆分成一个数组来读取每一行并计算数值的平均值(genomegag, pol, env), 并将上述每一列的平均值写入新文件。

我一直在尽最大努力弄清楚如何不考虑第一行或第一列,但每次我尝试在命令行上执行时,我都会不断出现“显式包名称”错误.

Global symbol @average requires explicit package name at line 23.
Global symbol @average requires explicit package name at line 29.
Execution aborted due to compilation errors.

我知道这涉及 @$,但即使知道我也无法更改错误。

这是我的代码,但我要强调的是我是上周刚开始的初学者:

#!/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 $count = 0;
my $average = ();

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

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

如果有任何见解,我将不胜感激,如果合适,我也非常感谢通过列表编号让我知道您在每个步骤中所做的事情。我想学习,如果我能够通读某人的流程,这对我来说会更有意义。

最佳答案

这里是你需要改变的地方
为 header 使用另一个变量

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

然后改变if语句里面的逻辑

if ( $count == 1 ) {
@header = @columns;
}

现在不要使用 @average对于限制,使用 $i < scalar @columns对于 else 语句。最初 @average为零,您将永远不会进入 for 循环。

else {
for( my $i = 1; $i < scalar @columns; $i++ ) {
$average[$i] += $columns[$i];
}
}

最后加上-1到你的柜台。请记住,您在解析 header 时会增加计数器

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

这是最终代码
你可以利用 @header整齐地显示结果

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

还有其他方法可以编写此代码,但我认为最好只更正您的代码,这样您就可以轻松理解您的代码有什么问题。希望对你有帮助

关于perl - 如何从制表符分隔的数据文件中平均列值,忽略标题行和左列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677533/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com