首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取包含字符串和可变编号模式的行

提取包含字符串和可变编号模式的行
EN

Stack Overflow用户
提问于 2019-05-07 17:30:38
回答 3查看 51关注 0票数 0

我有一个很大的文件,很多行都是这样开头的:

代码语言:javascript
复制
22 16052167 rs375684679 A AAAAC . PASS DR2=0.02;AF=0.4728;IMP GT:DS

在这些行中,DR2值的范围从0到1,我想提取那些包含大于0.8的DR2值的行。

我尝试过sedawk两种解决方案,但似乎都不起作用……我尝试过以下几种方法:

代码语言:javascript
复制
grep "DR2=[0-1]\.[8-9]*" myfile
EN

回答 3

Stack Overflow用户

发布于 2019-05-07 17:48:52

这将匹配值大于或等于0.8的行。如果您坚持使用严格大于,那么我将不得不添加一些复杂性,以防止0.8匹配。

代码语言:javascript
复制
grep 'DR2=\(1\|0\.[89]\)' myfile

诀窍是您需要两个单独的子模式:一个匹配1或更大,一个匹配0.8或更大。

票数 4
EN

Stack Overflow用户

发布于 2019-05-07 20:32:14

  • grep: grep -E 'DR2=\([1-9]\|0[.][89]\)'
  • sed: sed -n '/\([1-9]\|0[.][89]\)/p'
  • awk: awk '/\([1-9]\|0[.][89]\)/'

这3种解决方案都基于单个正则表达式,并且都做同样的事情(参见Ruud HelderMan's solution)。

然而,使用awk,如果你的限制有点棘手,你可以做一个艺术检查。比方说,我希望DR2的值在0.53到1.39之间。

代码语言:javascript
复制
awk '! match($0,/DR2=/) { next }
     { val = substr($0,RSTART+RLENGTH)+0 }
     ( 0.53 < val) && ( val < 1.39 )'
票数 1
EN

Stack Overflow用户

发布于 2019-05-08 00:19:20

每当您的数据中有tag=value对时,我发现最好首先在下面创建这些对(f[])的数组,然后您就可以通过它们的标记访问值。您没有提供任何0.8的输入来进行测试,因此使用您提供的数据:

代码语言:javascript
复制
$ awk '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]} f["DR2"] > 0.01' file
22 16052167 rs375684679 A AAAAC . PASS DR2=0.02;AF=0.4728;IMP GT:DS

或者使用标记和值的变量:

代码语言:javascript
复制
$ awk -v tag='DR2' -v val='0.8' '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]} f[tag] > val' file
$
$ awk -v tag='DR2' -v val='0.01' '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]} f[tag] > val' file
22 16052167 rs375684679 A AAAAC . PASS DR2=0.02;AF=0.4728;IMP GT:DS
$
$ awk -v tag='AF' -v val='0.4' '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]} f[tag] > val' file
22 16052167 rs375684679 A AAAAC . PASS DR2=0.02;AF=0.4728;IMP GT:DS
$
$ awk -v tag='AF' -v val='0.5' '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]} f[tag] > val' file
$

或者使用复合条件:

代码语言:javascript
复制
$ awk '{split($8,t,/[=;]/); for (i=1; i in t; i+=2) f[t[i]]=t[i+1]}
        (f["AF"] > 0.4) && (f["AF"] < 0.5) && (f["DR2"] >= 0.02)
' file
22 16052167 rs375684679 A AAAAC . PASS DR2=0.02;AF=0.4728;IMP GT:DS

重点是,无论您想要对这些标记的值做什么比较,都是微不足道的,并且您不需要编写更多的代码来隔离和保存这些标记及其值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56019584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档