我有一个问题。我在bash和awk中使用此代码:
#!/bin/bash
awk 'BEGIN {print "CHR\tSTART\tSTOP\tPOCET_READU\tGCcontent"}'
for z in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
do
export $z
for i in {0..249480000..60000}
do
u=$i
let "u +=60000"
export $i
export $u
samtools view /home/filip/Desktop/AMrtin\ Hynek/highThan89MapQ.bam chr$z:$i-$u | awk '{ n=length($10); print gsub(/[GCCgcs]/,"",$10)/n;}'| awk -v chr="chr"$z -v min=$i -v max=$u '{s+=$1}END{print chr,"\t",min,"\t",max,"\t",NR,"\t",s/NR}}'
done
done
从这里我得到的结果如下:
chr1 60000 120000 30 0.333
chr3 540000 600000 10 0.555
循环步长为60000,但如果我除了s / NR,有时NR为0且该行不在输出中。谢谢我想得到如果NR = 0且s / NR不存在(因为我们不能除以0):
chr1 0 60000 N / A N / A
chr1 60000 120000 30 0.333
chr3 480000 540000 N / A N / A
chr3 540000 600000 10 0.555
我尝试使用像
这样的条件 {s+=$1}END{print chr,"\t",min,"\t",max,"\t",NR,"\t",s/NR; if (S/NR == "") print chr,"\t",min,"\t",max,"\t","N/A","\t","N/A"}'
但它不起作用。
你能帮帮我吗?
答案 0 :(得分:1)
问题是你要除以零,这是一个错误。在进行除法之前,您需要先测试NR
。
awk -v chr="chr"$z -v min=$i -v max=$u '
{s+=$1}
END {print chr, "\t", min, "\t", max, "\t", (NR ? NR : "N/A"), "\t", (NR ? s/NR : "N/A")}'