awk:命令。 line:1:fatal:尝试除以零

awk: cmd. line:1:fatal: division by zero attempted

我是一名生物信息学专业的学生,​​刚接触 bash 和编程知识。 我想计算基因组覆盖率。 #这是我的脚本,我用xx切换真实参数但我确定xxs没有问题,其他同学已经执行了这个脚本没有错误。

filename=
reference=/xx
filebase=$(basename $filename .bam)

samtools view ${filename} -F 4 -q 30 -b > ${filebase}.f.bam

genomeCoverageBed -ibam -g ${filebase}.f.bam  ${reference} > /mnt/ABC/projects/abc/def/${filebase}.cov

coverage=$(grep genome /mnt/ABC/projects/abc/def/${filebase}.cov | awk '{NUM+=*; DEN+=} END {print NUM/DEN}')

echo -e "${filename},${coverage}" >> coverages.txt

当我执行这个脚本时 sh ./coverage.sh /mnt/XYZ/share/sdf_rawdata/hsa/mergedbams/ghj_merged_200203.hs37d5.cons.90perc.bam

它不起作用,请给我 awk: cmd。 line:1:致命:尝试除以零且无法识别参数:/mnt/XYZ/share/sdf_rawdata/hsa/mergedbams/ghj_merged_200203.hs37d5.cons.90perc.bam 错误 在 coverages.txt 文件中只有这一行 -e /mnt/NEOGENE2/share/compevo_rawdata/hsa/mergedbams/Ash128_all.merged.hs37d5.fa.cons.90perc.bam, 仅此而已。 感谢帮助

您需要设置一个条件来检查 DEN 变量是否为 NOT NULL 然后仅在 awk 代码的 END 块中进行除法(尝试在此处修复 OP 的尝试) .

coverage=$(grep genome /mnt/ABC/projects/abc/def/${filebase}.cov | awk '{NUM+=*; DEN+=} END {if(DEN){print NUM/DEN}}')

你不需要使用 grep 命令和 awk,我们可以在 awk 本身中搜索字符串,可能是这样的:

coverage=$(awk '/genome/{NUM+=*; DEN+=} END {if(DEN){print NUM/DEN}}' "/mnt/ABC/projects/abc/def/${filebase}.cov")



为什么会出现错误: 因为有时您的变量 DEN 中的值为零。让我们在这里以更短的方式举个例子(只是一些例子来理解这里的错误):

当变量 a 为 NULL 时,我们也会得到同样的错误。

awk 'BEGIN{a="";b=1;print b/a}'
awk: cmd. line:1: fatal: division by zero attempted

当变量 a 为零时,我们也会得到同样的错误:

awk 'BEGIN{a=0;b=1;print b/a}'
awk: cmd. line:1: fatal: division by zero attempted