Paul
Paul

Reputation: 1117

matching patterns between columns

The data is

   id    ecid  go1           go2
 GLY1   GLY21  Go:021        Go:022,Go:021
 GLY2   GLY32  Go:031,Go:023 Go:023,Go:021
 GLY5   GLY3   Go:012,Go:021 Go:021 
 GLY6   GLY7   Go:021        Go:021

and I want to match patterns between two columns and tried

awk '($3 == "Go:021") && ($4 == "Go:021")' trial.txt 

This only lists

GLY6   GLY7   Go:021    Go:021

But I would like other columns which contain the matching patterns as well

GLY1   GLY21  Go:021        Go:022,Go:021
GLY5   GLY3   Go:012,Go:021 Go:021 
GLY6   GLY7   Go:021        Go:021

Upvotes: 1

Views: 42

Answers (3)

Ed Morton
Ed Morton

Reputation: 203532

You need this to remove redundancy and avoid false matches:

$ awk 'BEGIN{p="(^|,)Go:021(,|$)"} $3~p && $4~p' file
 GLY1   GLY21  Go:021        Go:022,Go:021
 GLY5   GLY3   Go:012,Go:021 Go:021
 GLY6   GLY7   Go:021        Go:021

To keep the header line:

$ awk 'BEGIN{p="(^|,)Go:021(,|$)"} (NR==1) || ($3~p && $4~p)' file
   id    ecid  go1           go2
 GLY1   GLY21  Go:021        Go:022,Go:021
 GLY5   GLY3   Go:012,Go:021 Go:021
 GLY6   GLY7   Go:021        Go:021

Upvotes: 1

tinkertime
tinkertime

Reputation: 3042

awk '/ Go:021 .* Go:021 /{print $0}' trial.txt

Upvotes: 0

karakfa
karakfa

Reputation: 67507

use pattern match instead

$ awk '$3~/Go:021/ && $4~/Go:021/' file
 GLY1   GLY21  Go:021        Go:022,Go:021
 GLY5   GLY3   Go:012,Go:021 Go:021
 GLY6   GLY7   Go:021        Go:021

Upvotes: 3

Related Questions