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
我是一名生物信息学专业的学生,刚接触 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