[英]perl regex for specific string
我想將字符串分成不同的列。 每行如下所示。
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"
按特定的字符匹配進行"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];
}
兩次拆分可能使您更輕松:
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"
那是您要找的東西嗎?
過度使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.