Splitting columns and counting occurrences of determined character per line

Viewed 35

I'm trying to count sum of of occurrences for each C T A G per line, and output it in the end of each respective line. So, my input looks like this

NC_044998.1  3749  0  GG  0  GG  0  GG  0  GG  1  GC  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG 
NC_044998.1  3755  1  TA  0  TT  0  TT  1  TA  1  TA  1  TA  1  TA  0  TT  1  TA  0  TT  1  TA
NC_044998.1  4012  0  TT  1  TA  1  TA  0  TT  0  TT  0  TT  0  TT  1  TA  0  TT  1  TA  0  TT
NC_044998.1  5298  1  GA  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  1  GA  0  GG  0  GG

Desired output looks like this

NC_044998.1  3749  0  GG  0  GG  0  GG  0  GG  1  GC  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG 1 0 0 21
NC_044998.1  3755  1  TA  0  TT  0  TT  1  TA  1  TA  1  TA  1  TA  0  TT  1  TA  0  TT  1  TA 0 15 7 0
NC_044998.1  4012  0  TT  1  TA  1  TA  0  TT  0  TT  0  TT  0  TT  1  TA  0  TT  1  TA  0  TT 0 18 4 0
NC_044998.1  5298  1  GA  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  1  GA  0  GG  0  GG 0 0 2 20

I've tried to adapt this, but it only print 0 0 0 0 for all lines

BEGIN {
    numTags = split("C T A G",tags)
}
{
    s = 0
    for (i=4; i<=24; i+=2) {
        for (j=1; j<=2; ++j)
        tag = substr($i,j,1)
        s+=tag
    }
    printf "%s", $0
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        s = tags[tagNr]
        printf "%s%d", OFS, s
    }
    print ""
}
1 Answers
$ awk '{ o=$0; $1=""; print o, gsub(/C/,""), gsub(/T/,""), gsub(/A/,""), gsub(/G/,"") }' file
NC_044998.1  3749  0  GG  0  GG  0  GG  0  GG  1  GC  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG 1 0 0 21
NC_044998.1  3755  1  TA  0  TT  0  TT  1  TA  1  TA  1  TA  1  TA  0  TT  1  TA  0  TT  1  TA 0 15 7 0
NC_044998.1  4012  0  TT  1  TA  1  TA  0  TT  0  TT  0  TT  0  TT  1  TA  0  TT  1  TA  0  TT 0 18 4 0
NC_044998.1  5298  1  GA  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  1  GA  0  GG  0  GG 0 0 2 20

If you wanted to use an array of tags (characters) to avoid explicitly calling gsub() 4 times then you could do it as:

$ cat tst.awk
BEGIN {
    numTags = split("C T A G",tags)
}
{
    printf "%s", $0
    $1 = ""
    for (tagNr=1; tagNr<=numTags; tagNr++) {
        tag = tags[tagNr]
        printf "%s%d", OFS, gsub(tag,"")
    }
    print ""
}

$ awk -f tst.awk file
NC_044998.1  3749  0  GG  0  GG  0  GG  0  GG  1  GC  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG 1 0 0 21
NC_044998.1  3755  1  TA  0  TT  0  TT  1  TA  1  TA  1  TA  1  TA  0  TT  1  TA  0  TT  1  TA 0 15 7 0
NC_044998.1  4012  0  TT  1  TA  1  TA  0  TT  0  TT  0  TT  0  TT  1  TA  0  TT  1  TA  0  TT 0 18 4 0
NC_044998.1  5298  1  GA  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  0  GG  1  GA  0  GG  0  GG 0 0 2 20

but IMHO that's overkill for this specific problem unless you think you'll be adding additional tags in future.

Related