【问题标题】:awk: cmd. line:1:fatal: division by zero attemptedawk:命令。 line:1:fatal: 除零尝试
【发布时间】:2020-11-16 06:53:00
【问题描述】:

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

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.行: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 等于零。您没有在$filebase.cov 中显示违规行的内容,因此我们无法知道第三个字段,因此不知道如何计算DEN
  • 顺便说一句,如果用户传入包含空格或其他 shell 元字符的文件名,您的脚本将失败。请参阅When to wrap quotes around a shell variable(TLDR:基本上总是)。

标签: linux shell awk bioinformatics genome


【解决方案1】:

您需要设置一个条件来检查DEN 变量是否不为空,然后只在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

【讨论】:

  • 还要注意,任何看起来像grep 'x' | awk '{ y }' 的东西都可以有效地重构为awk '/x/ { y }';另见useless use of grep.
  • @tripleee,谢谢,正如我提到的,我正在修复 OP 的尝试,让我也为此写一个注释。
  • 程序不应因输入错误而静默失败。抛出除以零错误很明显。
猜你喜欢
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
相关资源
最近更新 更多