Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

awk solution for pattern matching and allowing one ambiguity/mismatch

Tags:

regex

grep

awk

I would like to count the number of strings in a document.

If input is:

GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT
GGTAATGGTAT

And I search for GGTGGTGGT I would like to find 3 matches. Allowing for one ambiguity.

Using egrep it would look something like this and have an output of 3.

 egrep -c "GGTGGTGGT|.GTGGTGGT|G.TGGTGGT|GG.GGTGGT|GGT.GTGGT|GGTG.TGGT|GGTGG.GGT|GGTGGT.GT|GGTGGTG.T|GGTGGTGG." input
like image 576
Stuber Avatar asked Jan 09 '23 23:01

Stuber


1 Answers

Here's a way to generate that regex with bash:

$ patt=(GGTGGTGGT)
$ for ((i=0; i<${#patt[0]}; i++)); do 
    patt+=( "${patt[0]:0:i}.${patt[0]:i+1}" )
  done
$ regex=$(IFS='|'; echo "${patt[*]}")
$ echo "$regex"
GGTGGTGGT|.GTGGTGGT|G.TGGTGGT|GG.GGTGGT|GGT.GTGGT|GGTG.TGGT|GGTGG.GGT|GGTGGT.GT|GGTGGTG.T|GGTGGTGG.

and then:

awk -v regex="$regex" '$0 ~ regex' file

Or with awk only:

awk -v srch=GGTGGTGGT '
    BEGIN {
        regex = srch
        for (i=1; i<=length(srch); i++) 
            regex = regex "|" substr(srch,1,i-1) "." substr(srch, i+1)
    }
    $0 ~ regex
' << END
GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT
GGTAATGGTAT
END
GGTGGTGGTAT
GGTAGTGGTAT
GGTGGTGGTAT
like image 59
glenn jackman Avatar answered Jan 26 '23 01:01

glenn jackman