awk打印符合条件的行

时间:2016-09-08 21:54:36

标签: awk

我正在尝试打印出$1 intronic|UTR3|UTR5$2匹配特定模式[^*+-]+[*+-]的所有行。我认为下面的awk很接近,但我的current output1的列。我可以删除这些行但似乎不打印它们。输入文件是制表符分隔的。谢谢你:)。

强文

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

3 个答案:

答案 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美元包含一个[*+-]字符,并且前面有[^*+-]个字符,因此正则表达式错误或您的输入不包含它要排除的情况从输出。原来它什么也没做。