我正在尝试打印出$1
intronic|UTR3|UTR5
和$2
匹配特定模式[^*+-]+[*+-]
的所有行。我认为下面的awk
很接近,但我的current output
是1
的列。我可以删除这些行但似乎不打印它们。输入文件是制表符分隔的。谢谢你:)。
强文
Func.refGene Mutation Call Mutant Allele Frequency
1 intronic c.[434-90G>C]+[=] 52.93
1 intronic c.[433+79A>G]+[433+79A>G] 100
1 intronic c.[1017+56G>A]+[1017+56G>A] 100
1 exonic c.[1119G>A]+[=] 100
5 UTR3 c.[*68A>G]+[=] 51.46
AWK
awk -F'\t' '
$1 ~ "^(intronic|UTR3|UTR5)$" {
v=$2
sub(/^[^*+-]+[*+-]/,"",v)
if(v + 0 > 10)
print sub(/^[^*+-]+[*+-]/,"",v)
}1' file
当前输出
1
1
1
1
1
所需的输出
1 intronic c.[434-90G>C]+[=] 52.93
1 intronic c.[433+79A>G]+[433+79A>G] 100
1 intronic c.[1017+56G>A]+[1017+56G>A] 100
5 UTR3 c.[*68A>G]+[=] 51.46
答案 0 :(得分:2)
我假设您正在寻找以下内容。如果您的匹配需要调整,建议更正。我尝试了以下GNU Awk。将以下文件存储到script.awk。
#!/usr/bin/gawk -f
BEGIN {
FS="[ \t]+";
}
{
if ($2 ~ /^(intronic|UTR3|UTR5)$/ ) {
print "Matched Mutation Call:" $2;
if ($3 ~ /^[^*+-]+[*+-]/) {
print "Matched Mutant Allele :" $3;
if ($4 > 10) {
print "Matched Freq:" $4;
print "Matched Record:" $0;
}
}
}
print "END OF RECORD\n";
}
您将其运行为:
cat data | ./script.awk
如果你有更多的搜索/编程需求,那么学习perl也不会有什么坏处。
#!/usr/bin/perl -w
use strict;
while (my $line=<>) {
print "\nBEGIN OF RECORD\n";
chomp($line);
my @F=split(/\s+/,$line);
if ($F[1]=~/^(intronic|UTR3|UTR5)$/) {
print "Matched Mutation Call:".$F[1]."\n";
if ($F[2]=~/^[^*+-]+[*+-]/) {
print "Matched Mutant Allele :".$F[2]."\n";
if ($F[3] > 10) {
print "Matched Freq:".$F[3]."\n";
print "Matched Record:".$line."\n";
}
}
}
print "END OF RECORD\n";
}
你可以把它当作:
cat data | ./script.pl
答案 1 :(得分:1)
我正在尝试打印出1美元内含的所有行| UTR3 | UTR5
在您的示例输入中,没有$ 1是intronic | UTR3 | UTR5的行。在所有行中,$ 1是1或5或“Func.refGene”。
和$ 2匹配某种模式[^ + - ] + [ + - ]。
在您的示例输入中,没有$ 2与此模式匹配的行。在所有行中,$ 2是“Mutation Call”,“intronic”,“exonic”或“UTR3”。
有些行,但是,$ 2是intronic|UTR3|UTR5
,$ 3匹配[^*+-]+[*+-]
。如果这是你想要的,你需要:
awk -F'\t' '$2 ~ "^(intronic|UTR3|UTR5)$" && $3 ~ "[^*+-]+[*+-]"' file
这会产生您想要的输出。
但是,您确定了解模式[^*+-]+[*+-]
的含义是什么吗?它表示:除[*+-]
之外的任何字符中的一个或多个,后跟[*+-]
。这意味着与[^*+-][*+-]
相同。可能,你的意思是其他一些模式。
最后,你的程序几乎与你想要的内容无关。要么你想要完全不同的东西,要么你的程序完全没有意义。
答案 2 :(得分:1)
Awk字段编号(以及字符串和数组索引)从1开始,而不是0:
$ awk '($2~/^(intronic|UTR[35])$/) && ($3~/^[^*+-]+[*+-]/) && ($4>10)' file
1 intronic c.[434-90G>C]+[=] 52.93
1 intronic c.[433+79A>G]+[433+79A>G] 100
1 intronic c.[1017+56G>A]+[1017+56G>A] 100
5 UTR3 c.[*68A>G]+[=] 51.46
但您的示例输入中每3美元包含一个[*+-]
字符,并且前面有[^*+-]
个字符,因此正则表达式错误或您的输入不包含它要排除的情况从输出。原来它什么也没做。