时间:2016-04-18 15:54:30

标签: 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 == "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

3 个答案:

答案 0 :(得分:3)

使用模式匹配

$ 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

答案 1 :(得分:1)

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

$ 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

答案 2 :(得分:0)

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