AWK打印文件名和函数结果



我有一个在一列中包含数百万个条目的文件,因此我使用awk,这是我所知道的用于这些计算的最快方法。我需要计算列中值的平均值,我已经这样做了:

allsamples="R3 SM261_T SM382_T R6"
for sample in $allsamples
do
awk BEGIN {print "ID","Coverage"}; '{sum+=$2} END { print "Average = ",sum/NR}' $sample.dep > $sample.mean_coverage.temp >> All_samples_coverage.txt
done

脚本正常工作并打印我需要的头,但我还需要打印平均值旁边的文件名。

我已经试过了:

awk 'BEGIN {print "ID","Coverage"}; {print FILENAME} {sum+=$2} END {print "Average = ",sum/NR}'

但是它打印原始文件的每一行的文件名(所以如果r3 . deep有6000万行,它将打印6000万倍的文件名,然后再输出函数结果)。

示例文件为:

Locus   Total_Depth Average_Depth_sample    Depth_for_R3
chr1:10001  4   4.00    4
chr1:10002  5   5.00    5
chr1:10003  7   7.00    7
chr1:10004  9   9.00    9

我得到的是:

ID Coverage
R3.txt
R3.txt
R3.txt
R3.txt
R3.txt
Average =  5

我需要的是:

ID Coverage
R3.txt Average =  5

你知道我做错了什么吗?

根据您的陈述,我认为您的头文件不应该是AWK语句的一部分,而应该只是循环之前的bash回显,因为似乎所有文件都共享头文件。我还要加上"平均"标签作为头文件的一部分,并从下面的printf命令中删除它。

你的AWK语句应该变成
awk 'BEGIN{
sum=0 ;
}{
sum+=$2 ;
}END{
#printf("%10s:  Average = %sn", FILENAME, sum/NR ) ;
printf("%10s:  %sn", FILENAME, sum/NR ) ;
}'

最新更新