azlilili
azlilili

Reputation: 25

awk: cmd. line:1:fatal: division by zero attempted

I'm a bioinformatics student and new to bash and programming stuff. I want to calculate genome coverage.

This is my script. I switch the real parameter with xx but I'm sure xxs are not problematic. Other students already execute this script with no error.

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

When I execute this script with

sh ./coverage.sh /mnt/XYZ/share/sdf_rawdata/hsa/mergedbams/ghj_merged_200203.hs37d5.cons.90perc.bam

it doesn't work and gives me: 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 error and in the coverages.txt file it only has this line:

-e /mnt/NEOGENE2/share/compevo_rawdata/hsa/mergedbams/Ash128_all.merged.hs37d5.fa.cons.90perc.bam, nothing more.

Thanks for helping.

Upvotes: 0

Views: 1386

Answers (1)

RavinderSingh13
RavinderSingh13

Reputation: 133428

You need to put a condition to check if DEN variable is NOT NULL then only do the division in END block of awk code(trying to fix OP's attempt here).

coverage=$(grep genome /mnt/ABC/projects/abc/def/${filebase}.cov | awk '{NUM+=$2*$3; DEN+=$3} END {if(DEN){print NUM/DEN}}')

You need not to use grep command along with awk, we could search string in awk itself, may be something like:

coverage=$(awk '/genome/{NUM+=$2*$3; DEN+=$3} END {if(DEN){print NUM/DEN}}' "/mnt/ABC/projects/abc/def/${filebase}.cov")



Why error is coming: Because its sometimes your variable DEN is having zero values in it. Let's take an example here in shorter way(just some examples to understand the error here):

When variable a is NULL then also we get same error.

awk 'BEGIN{a="";b=1;print b/a}'
awk: cmd. line:1: fatal: division by zero attempted

When variable a is zero then also we get same error:

awk 'BEGIN{a=0;b=1;print b/a}'
awk: cmd. line:1: fatal: division by zero attempted

Upvotes: 3

Related Questions