awk匹配关键字并检查另一个字段的子模式

awk匹配关键字并检查另一个字段的子模式,awk,Awk,在下面的awk中,如果$3是SNV或MNV或INDEL,我将尝试打印整行以及标题行。如果该条件满足或为真,则在$4中找到子模式:GMAF=,并检查=符号后的值。如果该值小于或等于.01,则打印整行以及标题行 由于$3可能是SNV而$4可能是空的或空的,因此我也不确定如何捕捉这一点。第2行就是一个例子。假设如果$4中没有值,则该值与零相同,因此可能是重要的,并被提取。我也不知道如何在打印中包含标题行减去。--不是文件的一部分,它们只是用来指示标题。我还为每一行添加了注释。谢谢:) 文件制表符分隔

在下面的
awk
中,如果
$3
SNV或MNV或INDEL
,我将尝试打印整行以及标题行。如果该条件满足或为真,则在
$4
中找到
子模式
:GMAF=
,并检查=符号后的值。如果该值小于或等于.01,则打印整行以及标题行

由于
$3
可能是
SNV
$4
可能是空的或空的,因此我也不确定如何捕捉这一点。第2行就是一个例子。假设如果
$4
中没有值,则该值与零相同,因此可能是重要的,并被提取。我也不知道如何在打印中包含标题行减去
--
不是文件的一部分,它们只是用来指示标题。我还为每一行添加了注释。谢谢:)

文件
制表符分隔

##.....
##.....
#ID Name    Func    List     ---- header row ----
1   1   REF 
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
ID  Name    Func    List
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
所需输出
制表符分隔

##.....
##.....
#ID Name    Func    List     ---- header row ----
1   1   REF 
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
ID  Name    Func    List
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
awk

awk -F'\t' -v OFS='\t' 'NR>3   # define FS and OFS as tab and look in 3 row of file  
        $3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL"{   # start block and look in row 3 in`$2` for any of these words
        sub(/:GMAF=*/,"",$4);  # if found then search `$4` for `:GMAF=`
        VAL=substr($4,RSTART+4,RLENGTH-4);   3 extract the 4 digits after the = sign as VAL
                                             }  # close block
            for(i=1;i<=num;i++){   # create a loop to iterate over each line as i
                    if(VAL[i] <= 0.01){  3 check each VAL in iand if less then or equal to 0.01
                    {  # start block
                                    print $1, $2, $3, VAL;  # print output
                                      }  # end block
                next   # process next line
                }  # end block
                1' file
awk-F'\t'-v OFS='\t''NR>3#将FS和OFS定义为tab并查看文件的3行
$3==“SNV”| |$3==“MNV”| |$3==“INDEL”{#开始块并在“$2”的第3行中查找这些单词中的任何一个
sub(/:GMAF=*/,“”,$4);#如果找到,则在“$4”中搜索“:GMAF”=`
VAL=substr($4,RSTART+4,RLENGTH-4);3将=符号后的4位数字提取为VAL
}#闭合块
对于(i=1;i3#),请查看文件的3行
$3==“SNV”| |$3==“MNV”| |$3==“INDEL”{#开始块并在“$2”的第3行中查找这些单词中的任何一个
sub(/:GMAF=*/,“”,$4);#如果找到,则在“$4”中搜索“:GMAF”=`
VAL=substr($4,RSTART+4,RLENGTH-4);3将=符号后的4位数字提取为VAL
}#闭合块
对于(i=1;i简短回答:

要捕获
$4
未设置/空白/不存在的情况,这意味着对于awk,字段总数为3(
NF==3

要删除标题行前面的
#
,可以使用任何替代技术(即sub)。我在测试中使用了gensub

完整答案:
下面的代码似乎适合您的需要。虽然我没有使用制表符分隔的文件,但您可以根据制表文件进行相应调整

$ cat file4
##.....
##.....
#ID Name    Func    List
1   1   REF 
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
4   4   RNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
5   5   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.14
6   6   INDEL
7   7   RNV
8   8   SNV GMAF=0.0041:EMAF=0.0:AMAF=0.0014
9   9   SNV EMAF=0.0041:GMAF=0.1:AMAF=0.0014

$ awk 'NR<3{next}NR==3{print gensub(/^#/,"","1");next}($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") && NF==3{print;next}       
($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") {val=gensub(/.*GMAF=(.[^:]*).*/,"\\1","g",$4);if (val<=0.1) print}' file4
ID  Name    Func    List
2   2   SNV 
3   3   SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
6   6   INDEL
8   8   SNV GMAF=0.0041:EMAF=0.0:AMAF=0.0014
9   9   SNV EMAF=0.0041:GMAF=0.1:AMAF=0.0014
$cat文件4
##.....
##.....
#ID名称函数列表
1参考文献
2 SNV
3 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
4 RNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014
5 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.14
6英德尔
7 RNV
8 SNV GMAF=0.0041:EMAF=0.0:AMAF=0.0014
9 SNV EMAF=0.0041:GMAF=0.1:AMAF=0.0014

$awk'NRI修改了脚本中的空格和缩进,因此代码流更易于查看。现在您可以轻松查看所有语法和语义错误(缺少大括号、额外大括号、缺少注释开始字符等)所以,只要修复它们,如果仍然有问题,就回来。缩进和空格在软件中非常重要,找到一个好的标准来遵循,然后就这么做。哦,不要使用所有大写变量名来避免与内置变量冲突。@EdMorton感谢Ed的宝贵意见。我更新了我的答案,包括请给出您的大部分建议。不客气。不确定您为什么不使用
$3==“SNV”| |$3==“MNV”| |$3==“INDEL”{if(NF!=3){val=gensub(./.*GMAF=(.^:*).*/,“\\1”,“g”,“$4”);if(val>0.1)next}print}
或类似的方法保存指定相同的代码两次。谢谢。