awk提取部分字符串,与数字比较,输出原始行完整

时间:2014-03-13 19:43:24

标签: awk

使用基本的awk工具,假设我有一个文件,在“DP =”(第8列)之后和分号之前可以有任何数字。我想只保留这个数字为>的行。 10。

Chr1    26313   .       G       A,X     0       .       DP=78;I16=28,38,10,0,2405,88631,356,12836,3960,237600,530,29234,1195,26039,199,4509;VDB=0.0000  PL:DP   12,0,
Chr1    26597   .       G       T,X     0       .       DP=5;I16=29,27,0,10,2054,76598,389,15193,3360,201600,558,32130,1046,22598,238,5730;VDB=0.0000  PL:DP   48,0,
...etc..

如何使用awk提取数字,如果数字大于10,则只返回行?我想要的输出是(因为在另一行中,DP = 5 <10):

Chr1    26313   .       G       A,X     0       .       DP=78;I16=28,38,10,0,2405,88631,356,12836,3960,237600,530,29234,1195,26039,199,4509;VDB=0.0000  PL:DP   12,0,

这是我到目前为止所做的...但我无法弄清楚如何提取字符串并与数字进行比较:

awk '( $5 ~ /[ACGT]/ && $8 ~ /^DP=/  && $10 !~ /^0/) {print $0}' 

也许我可以把它分成两个awk命令?或者也许有一个技巧可以在一次通话中完成这一切?

很抱歉,如果它已被回答,但我环顾四周,无法弄清楚.. 我不想使用perl,gawk或其他任何东西..

编辑:我想我的例子太简单了......更新了它..

1 个答案:

答案 0 :(得分:2)

设置字段分隔符并测试条件。向字段添加0可以消除尾随;

awk -F'=' '$2+0>10' file

您的示例输入行似乎是实际输入的截断版本。因此,保持其余条件不变,您可以添加以下检查:

awk '$5~/[ACGT]/ && $8~/^DP=/ && $10!~/^0/{split($0,tmp,/[=;]/);if(tmp[2]>10) print}' file