K. Wamae
K. Wamae

Reputation: 225

awk - split column then get average

I'm trying to compute the average based on the values in column 5.

I intend to split the entries at the comma, sum the two numbers, compute the average and assign them to two new columns (ave1 and ave2).

I keep getting the error fatal: division by zero attempted, and I cannot get around it.

Below is the table in image format since I tried to post a markdown table and it failed.

Table

Here's my code: awk -v FS='\t' -v OFS='\t' '{split($5,a,","); sum=a[1]+a[2]}{ print $0, "ave1="a[1]/sum, "ave2="a[2]/sum}' vcf_table.txt

Upvotes: 0

Views: 59

Answers (1)

Ed Morton
Ed Morton

Reputation: 203209

Never write a[2]/sum, always write (sum ? a[2]/sum : 0) or similar instead to protect from divide-by-zero.

You also aren't taking your header row into account. Try this:

awk '
    BEGIN { FS=OFS="\t" }
    NR == 1 {
        ave1 = "AVE1"
        ave2 = "AVE2"
    }
    NR > 1 {
        split($5,a,",")
        sum = a[1] + a[2]
        if ( sum ) {
            ave1 = a[1] / sum
            ave2 = a[2] / sum
        }
        else {
            ave1 = 0
            ave2 = 0
        }
    }
    { print $0, ave1, ave2 }
' vcf_table.txt

Upvotes: 2

Related Questions