使用awk提取在一列中出现多个模式的行

时间:2016-06-02 14:07:00

标签: bash awk grep

我有一个包含遗传数据的大文本文件(94,807,000行)。我想提取特定列中出现特定模式的行。我尝试过以各种方式使用awk和grep,但没有找到完成工作的方法。该文件以空格分隔,如下所示:

   V1     V2 V3 V4   V5      V6
1: 10 179406  T  . HPGM T,T,T,T
2: 10 179407  T  . HPGM T,T,T,T
3: 10 179408  G  . HPGM G,G,G,G
4: 10 179409  A  . HPGM A,A,A,A
5: 10 179410  A  . HPGM A,A,A,A
6: 10 179411  T  . HPGM T,T,T,T

V5和V6可以有超过这里显示的四个条目,一切看起来都很奇怪,如:

   V1        V2 V3 V4   V5                    V6
1:  1 158154514  A  . HPGO A,AAAA..204..TTTT,A,A

我想保留H和P的两个条目(这些是V6中前两个逗号分隔的字符)的行完全 A,C,T或G,所以应该只有这四个字符中的一个。但是,H和P不必具有相同的特征。在V5中,可能会出现多种组合,但所有组合都以HP开头。我不感兴趣,如果之后有任何或多少条目,并且所有行都有H和P的条目,所以我不必处理丢失的条目。

我找到了一些答案,展示了如何使用逻辑或||搜索多个模式,一些使用$6 ~ '/A,.'显示在特定字段中的外观,以及如何使用== "pattern"查找完全匹配。但是,我没有找到合并这些东西的答案,也无法自己解决。非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用此awk命令:

awk 'split($NF, a, /,/) && a[1] a[2] ~ /^[ACTG]{2}$/' file

1: 10 179406  T  . HPGM T,T,T,T
2: 10 179407  T  . HPGM T,T,T,T
3: 10 179408  G  . HPGM G,G,G,G
4: 10 179409  A  . HPGM A,A,A,A
5: 10 179410  A  . HPGM A,A,A,A
6: 10 179411  T  . HPGM T,T,T,T
  • split($NF, a, /,/)用逗号分隔最后一列
  • a[1] a[2] ~ /^[ACTG]{2}$/正在使用正则表达式来确保分割后的第一个和第二个子字段是A or C or T or G
  • 之一