2015-05-04 5 views
1

Я хочу разбить строку на разные столбцы. Каждая из строк отображается ниже.perl regex для конкретной строки

TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1|  97.56 82  2  0  1  246  9  90  7e-51  167 

Я могу разделить на пробел, вкладки и "|" но у меня возникли проблемы с разделением остальной части первого раздела "TR10052|c9_g13_i6_DESeqResultsBacterialen=248" на конкретное совпадение символов. Я хочу, чтобы первый столбец был частью TR #####, второй столбец - C# _g # _i #, а третий столбец остался остальным, начиная с «_DESeq ...» и т. Д.

while (my $line = <RESULTS>) { 
    chomp $line; 
    my @column  = split(/[\t|] /_DES.*/ /, $line); 
    my $transcriptID = $column[0]; 
    my $isoform  = $column[1]; 
    my $deseq  = $column[2]; 
    } 

ответ

2

Два расколы может сделать его проще для вас:

my ($transcriptID, $rest) = split(/\|/, $line, 2); 
my ($isoform, $deseq) = split (/_DESeq/, $rest, 2); 
$deseq = "_DESeq$deseq"; 

трансформаций:

"TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1| 97.56 82 2 0 1 246 9 90 7e-51 167" 

в:

"TR10052", "c9_g13_i6", "_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1| 97.56 82 2 0 1 246 9 90 7e-51 167" 

Это то, что вы ищете?

3

Используйте отрицательный прогноз, чтобы разделить на символы подчеркивания не, за которым следует буква «буква».

разделите на этом регулярном выражении:

/\||\_(?![a-z]\d)|\s+/ 

См live regex demo соответствия нужных символов, на которых можно разделить.

1

Легко переоценить split. В этом случае я думаю, что лучше извлечь нужные поля, написав шаблон регулярного выражения.

Как это

use strict; 
use warnings; 

while (<DATA>) { 
    my ($transcript_id, $isoform, $deseq) = /^ ([^|]+) \| (c\d+_g\d+_i\d+) _ (\S+)/x; 
    print $_, "\n" for $transcript_id, $isoform, $deseq; 
} 

__DATA__ 
TR10052|c9_g13_i6_DESeqResultsBacterialen=248 gi|497816164|ref|WP_010130320.1|  97.56 82  2  0  1  246  9  90  7e-51  167 

выход

TR10052 
c9_g13_i6 
DESeqResultsBacterialen=248 
Смежные вопросы