我有一个相当大的文本文件,其中包含遗传数据(94807000行)。我想提取在特定列中出现特定模式的行。我试着用各种方法使用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"
查找精确匹配。然而,我没有找到将这些东西结合起来的答案,也无法自己解决。非常感谢您的帮助。
您可以使用以下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
中的一个