首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk打印行匹配准则

awk打印行匹配准则
EN

Stack Overflow用户
提问于 2016-09-08 21:54:35
回答 3查看 727关注 0票数 0

我试图打印出$1intronic|UTR3|UTR5的所有行,$2与特定的模式[^*+-]+[*+-]匹配。我认为下面的awk是接近的,但我的current output1的一列。我可以移除这些线条,但似乎没有打印出来。输入文件被标签删除。谢谢:)。

强文本

代码语言:javascript
复制
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

代码语言:javascript
复制
awk -F'\t' '
$1 ~ "^(intronic|UTR3|UTR5)$" {
v=$2
sub(/^[^*+-]+[*+-]/,"",v)
if(v + 0 > 10)
  print sub(/^[^*+-]+[*+-]/,"",v)
}1' file

电流输出

代码语言:javascript
复制
1
1
1
1
1

期望输出

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-08 23:20:22

我假设你正在寻找类似于以下内容的东西。如果你的匹配需要调整,建议修正。我用GNU Awk尝试了下面的方法。将以下文件存储到script.awk中。

代码语言:javascript
复制
#!/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";
}

你把它运行为:

代码语言:javascript
复制
cat data | ./script.awk

如果您有更多的搜索/编程需求,那么学习perl也是无害的。

代码语言:javascript
复制
#!/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";
}

你可以把它当作:

代码语言:javascript
复制
cat data | ./script.pl
票数 2
EN

Stack Overflow用户

发布于 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与[^*+-]+[*+-]匹配。如果这是你想要的,你需要:

代码语言:javascript
复制
awk -F'\t' '$2 ~ "^(intronic|UTR3|UTR5)$" && $3 ~ "[^*+-]+[*+-]"' file

这将产生您想要的输出。

但是,您确定您明白[^*+-]+[*+-]模式是什么意思吗?它的意思是:除[*+-]以外的任何字符中的一个或更多,然后是[*+-]。这意味着与[^*+-][*+-]相同。很可能,你指的是其他模式。

最后,您的程序几乎与您想要的内容无关。要么你想要完全不同的东西,要么你的程序毫无意义。

票数 1
EN

Stack Overflow用户

发布于 2016-09-09 13:44:09

Awk字段号(以及字符串和数组索引)从1开始,而不是0:

代码语言:javascript
复制
$ 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是错误的,还是您的输入没有涵盖它打算从输出中排除的情况。因为-它什么都没做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39400770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档