【发布时间】:2014-03-10 12:22:13
【问题描述】:
我想替换一个 grep |哇 | perl 命令和纯 perl 解决方案,使其运行起来更快更简单。
我想将 input.txt 中的每一行与一个 data.txt 文件进行匹配,并计算匹配 ID 名称和数字的值的平均值。
input.txt 包含 1 列 ID 号:
FBgn0260798
FBgn0040007
FBgn0046692
我想将每个 ID 号与其对应的 ID 名称和相关值进行匹配。这是 data.txt 的示例,其中第 1 列是 ID 号,第 2 列和第 3 列是 ID name1 和 ID name2,第 3 列包含我要计算平均值的值。
FBgn0260798 CG17665 CG17665 21.4497
FBgn0040007 Gprk1 CG40129 22.4236
FBgn0046692 RpL38 CG18001 1182.88
到目前为止,我使用 grep 和 awk 生成了一个包含匹配 ID 编号和值的相应值的输出文件,然后使用该输出文件使用以下命令计算计数和平均值:
# First part using grep | awk
exec < input.txt
while read line
do
grep -w $line data.txt | cut -f1,2,3,4 | awk '{print $1,$2,$3,$4} ' >> output.txt
done
# Second part with perl
open my $input, '<', "output_1.txt" or die; ## the output file is from the first part and has the same layout as the data.txt file
my $total = 0;
my $count = 0;
while (<$input>) {
my ($name, $id1, $id2, $value) = split;
$total += $value;
$count += 1;
}
print "The total is $total\n";
print "The count is $count\n";
print "The average is ", $total / $count, "\n";
这两个部分都可以正常工作,但我想通过只运行一个脚本来简化它。我一直在尝试找到一种更快的方法来在 perl 中一起运行所有内容,但是经过几个小时的阅读,我完全不知道该怎么做。我一直在玩散列、数组、if 和 elsif 语句,但成功率为零。如果有人有建议等,那就太好了。
谢谢, 哈丽特
【问题讨论】:
-
那么,上面的 perl 可以正常工作,但是速度太慢了?
-
请解释您的要求。您显示的程序将成功打印
output_1.txt第四列的平均值。你还需要吗?您似乎要求使用纯 Perl 解决方案来替换grep|awk|perl命令。请更彻底地解释,并显示您的完整命令行。
标签: perl if-statement awk grep