我正在使用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
我尝试不将变量$
放在变量中,但也会出现相同的错误。
有什么帮助吗?
答案 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}是否为非零值。