我有一个包含遗传数据的大文本文件(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"
查找完全匹配。但是,我没有找到合并这些东西的答案,也无法自己解决。非常感谢帮助。
答案 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