我试图打印出$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.46awk
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发布于 2016-09-08 23:20:22
我假设你正在寻找类似于以下内容的东西。如果你的匹配需要调整,建议修正。我用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发布于 2016-09-08 23:10:55
我试图打印$1是内含子UTR3的所有行UTR5
在您的示例输入中,没有哪一行$1是内含子式的\UTR3\UTR5。在所有行中,$1要么是1,要么是5或者是"Func.refGene“。
$2匹配某个模式^_+-+_+-。
在您的示例输入中,没有$2匹配此模式的行。在所有行中,$2是“突变呼叫”、“内含子”、“外显子”或"UTR3“。
但是,有些行$2是intronic|UTR3|UTR5,$3与[^*+-]+[*+-]匹配。如果这是你想要的,你需要:
awk -F'\t' '$2 ~ "^(intronic|UTR3|UTR5)$" && $3 ~ "[^*+-]+[*+-]"' file这将产生您想要的输出。
但是,您确定您明白[^*+-]+[*+-]模式是什么意思吗?它的意思是:除[*+-]以外的任何字符中的一个或更多,然后是[*+-]。这意味着与[^*+-][*+-]相同。很可能,你指的是其他模式。
最后,您的程序几乎与您想要的内容无关。要么你想要完全不同的东西,要么你的程序毫无意义。
发布于 2016-09-09 13:44:09
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都包含一个[*+-]字符,其前面的字符是[^*+-],所以无论是regexp是错误的,还是您的输入没有涵盖它打算从输出中排除的情况。因为-它什么都没做。
https://stackoverflow.com/questions/39400770
复制相似问题