获得以模式结尾的n行

时间:2017-03-03 12:43:42

标签: bash python-2.7 awk command-line

我有这个文件(+ 200k行):

##gff-version 2
##source-version bepipred-1.0b
##date 2017-03-02
##Type Protein EgrG_000076200.1
##Protein EgrG_000076200.1 cat seq.1.fsa
##MSPRGCLLLLMLVVILGISIQWTEAQGHRSDGQAEEFAVAKEMEEEDDDDEGEDYDDDDEEEEKEVVANRESKLLKHCLNLQNALKEKMESVVNQMKDCSKILALA
##end-Protein
# seqname            source        feature      start   end   score  N/A   ?
# ---------------------------------------------------------------------------
EgrG_000076200.1     bepipred-1.0b epitope          1     1   0.920  . .  M|E
EgrG_000076200.1     bepipred-1.0b epitope          2     2   0.544  . .  S|.
EgrG_000076200.1     bepipred-1.0b epitope          3     3  -0.070  . .  P|.
EgrG_000076200.1     bepipred-1.0b epitope         12    12  -3.747  . .  L|.
EgrG_000076200.1     bepipred-1.0b epitope         13    13  -3.223  . .  V|.
EgrG_000076200.1     bepipred-1.0b epitope         14    14  -2.999  . .  V|.
EgrG_000076200.1     bepipred-1.0b epitope         15    15  -2.401  . .  I|.
EgrG_000076200.1     bepipred-1.0b epitope         16    16  -2.271  . .  L|.
EgrG_000076200.1     bepipred-1.0b epitope         17    17  -1.701  . .  G|.
EgrG_000076200.1     bepipred-1.0b epitope         18    18  -1.569  . .  I|.
EgrG_000076200.1     bepipred-1.0b epitope         19    19  -1.072  . .  S|.
EgrG_000076200.1     bepipred-1.0b epitope         20    20  -0.532  . .  I|.
EgrG_000076200.1     bepipred-1.0b epitope         21    21  -0.055  . .  Q|.
EgrG_000076200.1     bepipred-1.0b epitope         22    22   0.128  . .  W|.
EgrG_000076200.1     bepipred-1.0b epitope         23    23   0.553  . .  T|.
EgrG_000076200.1     bepipred-1.0b epitope         24    24   0.541  . .  E|.
EgrG_000076200.1     bepipred-1.0b epitope         25    25   0.923  . .  A|E
EgrG_000076200.1     bepipred-1.0b epitope         26    26   0.992  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         27    27   1.480  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         28    28   1.540  . .  H|E
EgrG_000076200.1     bepipred-1.0b epitope         29    29   1.564  . .  R|E
EgrG_000076200.1     bepipred-1.0b epitope         30    30   1.591  . .  S|E
EgrG_000076200.1     bepipred-1.0b epitope         31    31   1.582  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         32    32   1.599  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         33    33   1.280  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         34    34   1.101  . .  A|E
EgrG_000076200.1     bepipred-1.0b epitope         35    35   0.777  . .  E|.
EgrG_000076200.1     bepipred-1.0b epitope         36    36   0.516  . .  E|.
EgrG_000076200.1     bepipred-1.0b epitope         37    37   0.353  . .  F|.
EgrG_000076200.1     bepipred-1.0b epitope         38    38   0.273  . .  A|.
EgrG_000076200.1     bepipred-1.0b epitope         39    39   0.068  . .  V|.
EgrG_000076200.1     bepipred-1.0b epitope         40    40   0.086  . .  A|.
EgrG_000076200.1     bepipred-1.0b epitope         41    41   0.124  . .  K|.
EgrG_000076200.1     bepipred-1.0b epitope         42    42   0.648  . .  E|.
EgrG_000076200.1     bepipred-1.0b epitope         43    43   1.026  . .  M|E
EgrG_000076200.1     bepipred-1.0b epitope         44    44   1.520  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         45    45   1.842  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         46    46   2.132  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         47    47   2.271  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         48    48   2.605  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         49    49   2.669  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         50    50   2.778  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         51    51   2.544  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         52    52   2.506  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         53    53   2.464  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         54    54   2.464  . .  D|E
   ##Protein EgrG_000524000.1 cat seq.3.fsa
##MATAQRLLTASLLLISVLIPLISARRPSYYVHGLKFSRPCENNTYDEMTGNFKCTVPTGAECFQLCQQYGCYEWSFSSFMPSTDMHVRDHFRCRCIQDICLYNYVRVRDRDYE
##end-Protein
# seqname            source        feature      start   end   score  N/A   ?
# ---------------------------------------------------------------------------
EgrG_000524000.1     bepipred-1.0b epitope          1     1   0.143  . .  M|.
EgrG_000524000.1     bepipred-1.0b epitope          2     2   0.068  . .  A|.
EgrG_000524000.1     bepipred-1.0b epitope          3     3  -0.340  . .  T|.
EgrG_000524000.1     bepipred-1.0b epitope          4     4  -0.654  . .  A|.
EgrG_000524000.1     bepipred-1.0b epitope          5     5  -0.563  . .  Q|.
EgrG_000524000.1     bepipred-1.0b epitope          6     6  -0.500  . .  R|.
EgrG_000524000.1     bepipred-1.0b epitope          7     7  -0.448  . .  L|.
EgrG_000524000.1     bepipred-1.0b epitope          8     8  -0.904  . .  L|.
EgrG_000524000.1     bepipred-1.0b epitope         41    41   1.129  . .  E|E
EgrG_000524000.1     bepipred-1.0b epitope         42    42   1.135  . .  N|E
EgrG_000524000.1     bepipred-1.0b epitope         43    43   1.223  . .  N|E
EgrG_000524000.1     bepipred-1.0b epitope         48    48   0.557  . .  M|.
EgrG_000524000.1     bepipred-1.0b epitope         49    49   0.415  . .  T|.
EgrG_000524000.1     bepipred-1.0b epitope         50    50   0.269  . .  G|.
EgrG_000524000.1     bepipred-1.0b epitope         51    51   0.188  . .  N|.
EgrG_000524000.1     bepipred-1.0b epitope         52    52  -0.024  . .  F|.
EgrG_000524000.1     bepipred-1.0b epitope         53    53   0.184  . .  K|.
EgrG_000524000.1     bepipred-1.0b epitope         54    54   0.280  . .  C|.

等等

我只需要选择以“| E”结尾的行,但序列中至少有6行,然后,如果下一行以“|”结尾,则插入一个分隔符。像:

EgrG_000076200.1     bepipred-1.0b epitope         25    25   0.923  . .  A|E
EgrG_000076200.1     bepipred-1.0b epitope         26    26   0.992  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         27    27   1.480  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         28    28   1.540  . .  H|E
EgrG_000076200.1     bepipred-1.0b epitope         29    29   1.564  . .  R|E
EgrG_000076200.1     bepipred-1.0b epitope         30    30   1.591  . .  S|E
EgrG_000076200.1     bepipred-1.0b epitope         31    31   1.582  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         32    32   1.599  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         33    33   1.280  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         34    34   1.101  . .  A|E
-----
EgrG_000094950.1     bepipred-1.0b epitope        146   146   1.277  . .  I|E
EgrG_000094950.1     bepipred-1.0b epitope        147   147   1.443  . .  N|E
EgrG_000094950.1     bepipred-1.0b epitope        148   148   1.593  . .  G|E
EgrG_000094950.1     bepipred-1.0b epitope        149   149   1.740  . .  E|E
EgrG_000094950.1     bepipred-1.0b epitope        150   150   1.752  . .  D|E
EgrG_000094950.1     bepipred-1.0b epitope        151   151   2.206  . .  E|E
EgrG_000094950.1     bepipred-1.0b epitope        152   152   2.243  . .  E|E
EgrG_000094950.1     bepipred-1.0b epitope        153   153   2.194  . .  E|E
EgrG_000094950.1     bepipred-1.0b epitope        154   154   1.840  . .  A|E
EgrG_000094950.1     bepipred-1.0b epitope        155   155   1.451  . .  D|E
EgrG_000094950.1     bepipred-1.0b epitope        156   156   1.298  . .  E|E

我需要这个,因为在选择以“| E”结尾的这些聚类之后,我将需要计算每个ID得到的组数(组=连续的序列> = 6'| E')( ID = EgrG _ *)

我尝试过使用:grep 'EgrG' bepipred_eg_es_final_rev.txt | sed '/^#/d;s/.*|\./-----/' | uniq 这是我得到的一个例子:

-----
EgrG_000076200.1     bepipred-1.0b epitope          1     1   0.920  . .  M|E
-----
EgrG_000076200.1     bepipred-1.0b epitope         25    25   0.923  . .  A|E
EgrG_000076200.1     bepipred-1.0b epitope         26    26   0.992  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         27    27   1.480  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         28    28   1.540  . .  H|E
EgrG_000076200.1     bepipred-1.0b epitope         29    29   1.564  . .  R|E
EgrG_000076200.1     bepipred-1.0b epitope         30    30   1.591  . .  S|E
EgrG_000076200.1     bepipred-1.0b epitope         31    31   1.582  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         32    32   1.599  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         33    33   1.280  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         34    34   1.101  . .  A|E
-----
EgrG_000076200.1     bepipred-1.0b epitope         43    43   1.026  . .  M|E
EgrG_000076200.1     bepipred-1.0b epitope         44    44   1.520  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         45    45   1.842  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         46    46   2.132  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         47    47   2.271  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         48    48   2.605  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         49    49   2.669  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         50    50   2.778  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         51    51   2.544  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         52    52   2.506  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         53    53   2.464  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         54    54   2.464  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         55    55   2.455  . .  Y|E
EgrG_000076200.1     bepipred-1.0b epitope         56    56   2.442  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         57    57   2.457  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         58    58   2.451  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         59    59   2.390  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         60    60   2.477  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         61    61   2.295  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         62    62   1.861  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         63    63   1.400  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         64    64   1.014  . .  K|E
-----
EgrG_000131300.1     bepipred-1.0b epitope         37    37   0.984  . .  N|E
-----

问题是,我不知道如何摆脱包含少于6行以'| E'结尾的组。 我也用python尝试过这个,但是得到了几乎相同的结果。

顺便说一下,我在Linux Mint 18.1和Ubuntu 16.04上工作。

我希望我能够很好地解释它。

1 个答案:

答案 0 :(得分:1)

对于分组,您可以使用awk

oneliner

 awk -F\| '$NF=="."{if(cont>=6){for (i=1;i<=cont;i++){print a[i]};print "-----"}cont=0;delete a;next}$NF=="E"{a[++cont]=$0}' yourfile

多:

 awk -F\| '$NF=="."{if(cont>=6){
                      for (i=1;i<=cont;i++){
                        print a[i]
                       }
                    print "-----"
                    }
                    cont=0
                    delete a
                    next}
           $NF=="E"{a[++cont]=$0}' yourfile

<强>结果

EgrG_000076200.1     bepipred-1.0b epitope         25    25   0.923  . .  A|E
EgrG_000076200.1     bepipred-1.0b epitope         26    26   0.992  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         27    27   1.480  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         28    28   1.540  . .  H|E
EgrG_000076200.1     bepipred-1.0b epitope         29    29   1.564  . .  R|E
EgrG_000076200.1     bepipred-1.0b epitope         30    30   1.591  . .  S|E
EgrG_000076200.1     bepipred-1.0b epitope         31    31   1.582  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         32    32   1.599  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         33    33   1.280  . .  Q|E
EgrG_000076200.1     bepipred-1.0b epitope         34    34   1.101  . .  A|E
-----
EgrG_000076200.1     bepipred-1.0b epitope         43    43   1.026  . .  M|E
EgrG_000076200.1     bepipred-1.0b epitope         44    44   1.520  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         45    45   1.842  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         46    46   2.132  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         47    47   2.271  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         48    48   2.605  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         49    49   2.669  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         50    50   2.778  . .  D|E
EgrG_000076200.1     bepipred-1.0b epitope         51    51   2.544  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         52    52   2.506  . .  G|E
EgrG_000076200.1     bepipred-1.0b epitope         53    53   2.464  . .  E|E
EgrG_000076200.1     bepipred-1.0b epitope         54    54   2.464  . .  D|E
-----

解释

-F\|:将F ield S eparator设置为|

$NF==".":当最后一个字段为点.时:

  • 阅读之前E次重复(连续)的内容,如果大于或等于6,则使用 for循环打印{{1}的内容} array用于存储以a结尾的记录。

    最后我们打印分隔符E

  • 对于所有------次出现,请初始化计数器.,删除cont数组并移至a记录。

next:当最后一个字段等于$NF=="E"{a[++cont]=$0}时,记录E的内容存储在由自动增量计数器$0索引的a数组中保持连续出现++cont条记录的数量。