在每个字符串匹配后添加一行

时间:2015-06-02 17:03:32

标签: perl parsing

我这里有一个示例文件http://pastebin.com/m5m40nGF

我想要做的是在每个protein_id实例后添加一行。 protein_id总是具有相同的模式: TAB-TAB-TAB-protein_id-TAB-GNL | CorradiLab | M715_#SOME_NUMBER

我需要做的是在每行prote_id之后添加: TAB-TAB-TAB-transcript_id-TAB-GNL | CorradiLab | M715_mRNA_#SOME_NUMBER

问题是#SOME_NUMBER必须保持不变。

在第一种情况下,它看起来像这样: 94 1476 CDS                         protein_id gnl | CorradiLab | M715_ECU01_0190                         transcript_id gnl | CorradiLab | M715_mRNA_ECU01_0190                         产品丝氨酸羟甲基转移酶                         标记丝氨酸羟甲基转移酶

谢谢!阿德里安

我尝试了一个perl解决方案,但是我收到了一个错误。

open(IN, $in); while(<IN>){
   print $_;
   if ($_ ~= /gnl\|CorradiLab\|/) {
       $_ =~ s/tprotein_id/transcript_id/;
       print $_;
   }
    }

错误:

syntax error at test.pl line 3, near "$_ ~"
syntax error at test.pl line 7, near "}"
Execution of test.pl aborted due to compilation errors.

2 个答案:

答案 0 :(得分:0)

以下perl脚本工作

my $in=shift;
open(IN, $in); while(<IN>){
    print $_;
    if ($_ =~ /gnl\|CorradiLab\|/) {
        my $tmp = $_;
        $tmp =~ s/protein_id/transcript_id/;
            print $tmp;
    }
}

答案 1 :(得分:0)

提供现有答案的更新,因为我觉得可以进一步改进: 一般来说 - OP中的确切问题是这一行:

 if ($_ ~= /gnl\|CorradiLab\|/) {

因为您~=没有=~。这是syntax error at test.pl line 3, near "$_ ~"试图告诉你的内容。

我会提供改进:

my $in=shift;
open(IN, $in); while(<IN>){
    print $_;
    if ($_ =~ /gnl\|CorradiLab\|/) {
        my $tmp = $_;
        $tmp =~ s/protein_id/transcript_id/;
            print $tmp;
    }
}
  • while ( my $tmp = <IN> ) {跳过了分配$_的需要。
  • 3参数open最好使用词法文件句柄。例如。 open ( my $in, "<", "$input_filename" ) or die $!;(您应该测试open是否也有效)
  • 如果您只是从命令行读取文件名,则显式打开可能是不必要的。使用<>读取文件名(打开和处理)或STDIN,这意味着您的脚本变得更加通用。

因此我会改写为:

#!/usr/bin/perl
use strict;
use warnings;

while ( my $line = <> ) {
    print $line;
    if ( $line =~ /gnl\|CorradiLab\|/ ) {
        $line =~ s/protein_id/transcript_id/;
        print $line;
    }
}

或者:

#!/usr/bin/perl
use strict;
use warnings;

while (<>) {
    print;
    if (m/gnl\|CorradiLab\|/) {
        s/protein_id/transcript_id/;
        print;
    }
}