0

我必须解析一个看起来像这样的 UniProt 文件:

ID   001R_FRG3G              Reviewed;         256 AA.
AC   ERPL_ADA;
OS   Frog virus 3 (isolate Goorha) (FV-3).
ID   002L_FRG3G              Reviewed;         320 AA.
AC   Q6GZX3;
OS   Frog virus 3 (isolate Goorha) (FV-3 / ADD / PERM /
OS   strain HB).

等等。

我想检索所有操作系统标识符(物种),但情况是其中一些具有唯一的操作系统,而另一些则在连续行中重复了操作系统,我应该将它们连接起来。

这样输出将是:

OS Frog virus 3 (isolate Goorha) (FV-3).
OS Frog virus 3 (isolate Goorha) (FV-3 / ADD / PERM / strain HB).

对于一个操作系统事件,我可以使用正则表达式选择该行,例如:

while ($line=<IN>){

    chomp $line; 

    if ($line=~ /^OS\s{3}/ and $line=~ /\.$/){

               $os= $line;

    }

  }

但是当你有两个连续的操作系统时怎么办?我一直在尝试添加下一个,但我无法找到解决方案。

4

1 回答 1

0
my @species;
while (1) {
   my $line = <$IN>;

   if (defined($line)) {
      chomp($line);
      my @fields = split(' ', $_, 2);
      if ($fields[0] eq 'OS') {
         push @species, $fields[2];
      }
   }

   if (@species) {
      say join ' ', @species;
      @species = ();
   }

   last if !defined($line);
}
于 2019-11-20T20:56:05.100 回答