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}
或类似的方法保存指定相同的代码两次。谢谢。