2015-06-02 3 views
-1

У меня есть пример файла здесь http://pastebin.com/m5m40nGFДобавить строку после каждой строки матча

То, что я хочу сделать, это добавить строку после каждого экземпляра protein_id. protein_id всегда имеет один и тот же шаблон: TAB-TAB-TAB-protein_id-TAB-GNL | CorradiLab | M715_ # SOME_NUMBER

Что мне нужно сделать, чтобы добавить это после каждой строки protein_id: TAB-TAB- TAB-transcript_id-TAB-gnl | CorradiLab | M715_mRNA_ # SOME_NUMBER

Уловкой является то, что # НЕКОТОРЫЙ_NUMBER должен оставаться неизменным.

В первом случае, это будет выглядеть следующим образом: 94 1476 CDS protein_id GNL | CorradiLab | M715_ECU01_0190 transcript_id GNL | CorradiLab | M715_mRNA_ECU01_0190 серин продукт hydroxymethyltransferase этикетка серин hydroxymethyltransferase

Спасибо! Adrian

Я пробовал решение 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

Просьба указать язык, который вы пытаетесь разобрать файл с, и показать нам какой-либо код из предыдущих попыток при решении этой проблемы. Вы дали слишком мало информации для работы. – Serlite

+0

Мне было интересно, будет ли работать комбинация bash/sed/awk? К сожалению, я не уверен, как подойти к этой проблеме. –

ответ

0

Следующий Perl скрипт работал

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

Предложение обновления на существующий ответ, потому что я чувствую, что это может быть улучшено далее: Вообще - точная проблема ОП - это линия:

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; 
    } 
} 
Смежные вопросы