在awk结果除以零内处理变量

时间:2019-01-08 08:33:36

标签: shell awk fatal-error division divide-by-zero

我正在使用awk编写一个简单的shell命令,如下所示:

input_folder='/home/Desktop/files'
results_folder='/home/results'

for entry in $input_folder/*
do

re=$(samtools view -H $entry | grep -P '^@SQ' | cut -f 3 -d ':' | awk '{sum+=$1} END {print sum}')

echo -e "$(samtools depth $entry | awk '{sum+=$3} END { print $(sum/$re)}')\t/$entry" >> $results_folder/Results.txt

done

变量re中的结果是一个数字,但是在第二个命令re中使用print $(sum/$re)}'的结果给我这个错误 awk: cmd. line:1: (FILENAME=- FNR=312843568) fatal: division by zero attempted

我尝试不将变量$放在变量中,但也会出现相同的错误。

有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

awk部分更改为:

awk -v re="$re" '{sum+=$3} END { if(re) print sum/re; else print "oo";}'

您必须使用-v将变量传输到awk
而且最好检查re是否为零。
我用oo代表Infinity symbol

答案 1 :(得分:2)

我不清楚您为什么要向echo发送awk命令的输出。 Y我们实际的awk命令应该是避免您的错误(在该命令中,它表明您将其除以零)。尝试将您的awk程序更改为跟踪一次吗?

awk -v re="$re" '{sum+=$3} END {if(re){print (sum/re)} else {print "Please check seems value of re is ZERO else you will get an error from awk program}}'

答案 2 :(得分:0)

将bash变量替换为awk即可完成工作:

awk '{sum+=$3} END { print(sum/'${re}') }'

在传递给awk之前,您最好还要在bash中检查$ {re}是否为非零值。