shell awk:命令行:1:致命错误:试图被零除

8e2ybdfx  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(261)

我是一个生物信息学专业的学生,刚接触到bash和编程的东西。我想计算基因组覆盖率。
这是我的脚本。我用xx替换了真实的参数,但我确信xx没有问题。其他学生已经执行了这个脚本,没有出现错误。

filename=$1
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+=$2*$3; DEN+=$3} 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: fatal: division by zero attempted and unrecognized parameter:/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,仅此而已。
谢谢你的帮助。

djp7away

djp7away1#

您需要设置一个条件来检查DEN变量是否为NOT NULL,然后仅在awk代码的END块中执行除法(尝试在此处修复OP的尝试)。
coverage=$(grep genome /mnt/ABC/projects/abc/def/${filebase}.cov | awk '{NUM+=$2*$3; DEN+=$3} END {if(DEN){print NUM/DEN}}')
你不需要把grep命令和awk沿着使用,我们可以在awk本身中搜索字符串,可能是这样的:
coverage=$(awk '/genome/{NUM+=$2*$3; DEN+=$3} 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

相关问题