首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果下两行匹配,则使用awk打印行+下两行

如果下两行匹配,则使用awk打印行+下两行
EN

Stack Overflow用户
提问于 2017-08-02 11:18:16
回答 4查看 118关注 0票数 1

我有一个文件,它有一个文本条目,然后下面的几行是相关的外显子。有时这可能是一个外显子,因此是一个后续行,有时有'n‘个外显子,所以'n’后续行如下所示:

代码语言:javascript
运行
复制
1      Cufflinks       transcript      63846957        63847511 
1      Cufflinks       exon    63846957        63847511   
1      Cufflinks       transcript      63851691        63852040       
1      Cufflinks       exon    63851691        63852040 
2      Cufflinks       transcript      8442356 8443964 
2      Cufflinks       exon    8442356 8442368 
2      Cufflinks       exon    8443768 8443964
2      Cufflinks       exon    8444000 8444578
2      Cufflinks       transcript      8258988 8259803 
2      Cufflinks       exon    8258988 8259271 
2      Cufflinks       exon    8259370 8259803

只有当抄本后面有两个外显子时,我才会打印出抄本和相关的外显子行。对于本例,将只提取最后三行(一条转录记录行和两条外显子行)。

如何使用awk做到这一点呢?

EN

回答 4

Stack Overflow用户

发布于 2017-08-02 11:52:49

您可以将行保存在数组中,然后在确定外显子的数量后将其打印出来。

代码语言:javascript
运行
复制
#!/usr/bin/awk -f

BEGIN {
        number_of_exons = 0;
}

END {
        print_if_two_exons();
}

$3 == "transcript" {
        print_if_two_exons();
        transcript = $0;
}

$3 == "exon" {
        exons[number_of_exons++] = $0;
}

function print_if_two_exons() {
        if (transcript && number_of_exons == 2) {
                print transcript;
                for (i = 0; i < number_of_exons; i++) {
                        print exons[i];
                }
        }
        delete exons;
        number_of_exons = 0;
}

输出:

代码语言:javascript
运行
复制
2      Cufflinks       transcript      8258988 8259803 
2      Cufflinks       exon    8258988 8259271 
2      Cufflinks       exon    8259370 8259803
票数 0
EN

Stack Overflow用户

发布于 2017-08-02 12:49:35

代码语言:javascript
运行
复制
$ cat tst.awk
/transcript/ { prt() }
{ buf = buf $0 ORS; ++cnt }
END { prt() }
function prt() {
    if ( cnt == 3 ) {
        printf "%s", buf
    }
    buf = ""
    cnt = 0
}

$ awk -f tst.awk file
2      Cufflinks       transcript      8258988 8259803
2      Cufflinks       exon    8258988 8259271
2      Cufflinks       exon    8259370 8259803
票数 0
EN

Stack Overflow用户

发布于 2017-08-02 12:56:28

代码语言:javascript
运行
复制
$ cat awk-script
function set_all(s,t,e) {
  exon=e;tran=t;str=s
}
/transcript/{set_all($0,1,0)}
/exon/{
  if(tran){
    if(exon<2)
      set_all(str"\n"$0,tran,exon+1)
    else
      set_all("",0,0)
  } else        
    set_all("",0,0)
}
END {
  print str 
}

$ awk -f awk-script file
2      Cufflinks       transcript      8258988 8259803 
2      Cufflinks       exon    8258988 8259271 
2      Cufflinks       exon    8259370 8259803

非常简单的方法,我将如下解释它:

  • 设置变量exontran以记录exontranscript的连续显示计数,并设置函数set_all以设置strexonexon的值
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45450880

复制
相关文章

相似问题

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