缩短FASTA头Perl

缩短FASTA头Perl,perl,sed,bioinformatics,Perl,Sed,Bioinformatics,我需要从以下格式转换FASTA标头: gi | 351517969 |参考| NW | U 003613580.1 | Cricetulus griseus未定位基因组支架,CriGri | U 1.0支架329,全基因组鸟枪序列 为此: NW_003613580.1灰仓鼠非定位基因组支架,灰仓鼠1.0支架329,全基因组鸟枪序列 NW中的W在其他地址中可以是C,下划线后的位数不同 我找到了一个perl脚本来将ID更改为不同的格式,并试图对其进行修改。有关部分: while( $seq

我需要从以下格式转换FASTA标头:

gi | 351517969 |参考| NW | U 003613580.1 | Cricetulus griseus未定位基因组支架,CriGri | U 1.0支架329,全基因组鸟枪序列

为此:

NW_003613580.1灰仓鼠非定位基因组支架,灰仓鼠1.0支架329,全基因组鸟枪序列

NW中的W在其他地址中可以是C,下划线后的位数不同

我找到了一个perl脚本来将ID更改为不同的格式,并试图对其进行修改。有关部分:

    while( $seq = $seq_in->next_seq() ) 
{
    my $seqName = $seq->id;
    $seqName =~ s/\|/\./g; #replace pipe with dot

        $seqName =~ s/(NW\_)/$1/;   

        #$seqName =~ s/(gi\.\w*)\..*/$1/; 

        $seq->id($seqName);
    $seq_out->write_seq($seq);
}
注释掉的seqname位为原始位。我希望将gi改为NW会使它在标题中稍后开始阅读,但没有骰子。然而,将$1更改为随机文本确实会使其在NW处被替换,所以我不太确定。此外,更换管道的周期似乎没有任何逻辑原因就消失了(尽管我确实希望它们消失)。非常感谢您提供有关搜索和替换工作方式的任何帮助或至少一些资源。

拆分组件:

my @fastaHeaderComponents = split("\\|", $seq->id);
然后访问它们:

my $accessionId = $fastaHeaderComponents[3];
my $description = $fastaHeaderComponents[4];
并重新生成标题:

my $newFastaHeader = ">$accessionId $description";
$seq->id($newFastaHeader);
拆分组件:

my @fastaHeaderComponents = split("\\|", $seq->id);
然后访问它们:

my $accessionId = $fastaHeaderComponents[3];
my $description = $fastaHeaderComponents[4];
并重新生成标题:

my $newFastaHeader = ">$accessionId $description";
$seq->id($newFastaHeader);

使用
sed
一个衬里:

sed -r 's/^([^|]+\|){3}//;s/\|//' file
NW_003613580.1灰仓鼠非定位基因组支架,灰仓鼠1.0支架329,全基因组鸟枪序列

使用
sed
解决方案的好处是,您可以指定要在哪一行上进行替换,例如仅使用
1s
的第一行,并使用
-i
选项将替换存储回文件:

sed -ri '1s/^([^|]+\|){3}//;1s/\|//' file
解释:

s/     # Substitution, 1s/ first line only, 2s/ second line..
^      # Match the start of the line
(      # Group pattern
[^|]+  # Match one or more character that isn't a |
\|     # Match the | (escaped)
)      # End grouped pattern
{3}    # Repeat grouped pattern 3 times
/      # Replace with 
/      # Nothing
;
s/     # Substitute, 1s/ first line only..
\|     # The remaining |
/      # Replace with
/      # Nothing 

使用
sed
一个衬里:

sed -r 's/^([^|]+\|){3}//;s/\|//' file
NW_003613580.1灰仓鼠非定位基因组支架,灰仓鼠1.0支架329,全基因组鸟枪序列

使用
sed
解决方案的好处是,您可以指定要在哪一行上进行替换,例如仅使用
1s
的第一行,并使用
-i
选项将替换存储回文件:

sed -ri '1s/^([^|]+\|){3}//;1s/\|//' file
解释:

s/     # Substitution, 1s/ first line only, 2s/ second line..
^      # Match the start of the line
(      # Group pattern
[^|]+  # Match one or more character that isn't a |
\|     # Match the | (escaped)
)      # End grouped pattern
{3}    # Repeat grouped pattern 3 times
/      # Replace with 
/      # Nothing
;
s/     # Substitute, 1s/ first line only..
\|     # The remaining |
/      # Replace with
/      # Nothing 

简短版本:使用
split
将序列拆分为一个数组

my @parts = split( /\|/, $seq );
然后使用数组的元素构建一个要显示的字符串

print $parts[3], ' ', $parts[4], etc....

简短版本:使用
split
将序列拆分为一个数组

my @parts = split( /\|/, $seq );
然后使用数组的元素构建一个要显示的字符串

print $parts[3], ' ', $parts[4], etc....

这只是拆分管道字符上的原始标题(由可选空格包围)并重新连接所需字段的问题

use strict;
use warnings;

my $header = 'gi|351517969|ref|NW_003613580.1| Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence';

$header = join ' ', (split /\s*\|\s*/, $header)[3,4];

print $header;
输出

NW_003613580.1 Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence

这只是拆分管道字符上的原始标题(由可选空格包围)并重新连接所需字段的问题

use strict;
use warnings;

my $header = 'gi|351517969|ref|NW_003613580.1| Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence';

$header = join ' ', (split /\s*\|\s*/, $header)[3,4];

print $header;
输出

NW_003613580.1 Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence
这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):


或许以下内容会有所帮助:

use strict;
use warnings;
use Bio::SeqIO;

my $seq_in  = Bio::SeqIO->new( -file => 'input.fas',   '-format' => 'Fasta' );
my $seq_out = Bio::SeqIO->new( -file => '>output.fas', '-format' => 'Fasta' );

while ( my $seq = $seq_in->next_seq ) {
    my $shortened_seq = Bio::Seq->new(
        -desc       => $seq->desc,
        -display_id => ( split /\|/, $seq->id )[-1]
    );

    $seq_out->write_seq($shortened_seq);
}
给定如下所示的FASTA标头作为输入:

>gi|351517969|ref|NW_003613580.1| Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence
它产生以下输出:

>NW_003613580.1 Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence

或许以下内容会有所帮助:

use strict;
use warnings;
use Bio::SeqIO;

my $seq_in  = Bio::SeqIO->new( -file => 'input.fas',   '-format' => 'Fasta' );
my $seq_out = Bio::SeqIO->new( -file => '>output.fas', '-format' => 'Fasta' );

while ( my $seq = $seq_in->next_seq ) {
    my $shortened_seq = Bio::Seq->new(
        -desc       => $seq->desc,
        -display_id => ( split /\|/, $seq->id )[-1]
    );

    $seq_out->write_seq($shortened_seq);
}
给定如下所示的FASTA标头作为输入:

>gi|351517969|ref|NW_003613580.1| Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence
它产生以下输出:

>NW_003613580.1 Cricetulus griseus unplaced genomic scaffold, CriGri_1.0 scaffold329, whole genome shotgun sequence

您不必在普通字符串中转义
|
,只需在正则表达式中转义即可。我想应该是
split(“|“,$seq->id)
。我也这么想,直到我做了一个测试脚本来尝试它。你是对的。。。这很奇怪。好吧,好吧。您可以使用单引号,然后只需要一个斜杠:
split(“\\\”,$seq->id)
为FASTA文件添加了前导头符号
。实际上,
是文件格式的一部分,而不是序列标识符本身。您不必在普通字符串中转义
,只在正则表达式中转义。我想应该是
split(“|“,$seq->id)
。我也这么想,直到我做了一个测试脚本来尝试它。你是对的。。。这很奇怪。好吧,好吧。您可以使用单引号,然后只需要一个斜杠:
split(“\\\”,$seq->id)
为FASTA文件添加了前导头符号
。实际上,
是文件格式的一部分,而不是序列标识符本身。