我有一个在一列中包含数百万个条目的文件,因此我使用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 ) ;
}'