Awk 列之间的匹配模式

Awk 列之间的匹配模式,awk,sed,Awk,Sed,数据是 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 我想匹配两列之间的模式,并尝试 awk '($3 == "Go:021") && ($4

数据是

   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
我想匹配两列之间的模式,并尝试

awk '($3 == "Go:021") && ($4 == "Go:021")' trial.txt 
这只列出了

GLY6   GLY7   Go:021    Go:021
但我希望其他列也包含匹配模式

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

改用模式匹配

$ 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

改用模式匹配

$ 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

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

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

$ 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
要保留标题行,请执行以下操作:

$ 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

您需要这样做来删除冗余并避免错误匹配:

$ 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
要保留标题行,请执行以下操作:

$ 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

这可能更好:这可能更好: