我这里有一个示例文件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.
答案 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> ) {
跳过了分配$_
的需要。 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;
}
}