我需要从这种格式转换FASTA标头:
GI | 351517969 | REF | NW_003613580.1 | Cricetulus griseus未置放的基因组支架,CriGri_1.0 scaffold329,全基因组鸟枪序列
到此:
NW_003613580.1 Cricetulus griseus未置入的基因组支架,CriGri_1.0 scaffold329,全基因组鸟枪序列
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中替换它,所以我不太确定。此外,替换管道的时期似乎没有任何逻辑原因消失(虽然我确实希望它们消失)。任何帮助,或至少一些关于搜索和替换如何在这里工作的资源将不胜感激。
答案 0 :(得分:3)
拆分组件:
my @fastaHeaderComponents = split("\\|", $seq->id);
然后访问它们:
my $accessionId = $fastaHeaderComponents[3];
my $description = $fastaHeaderComponents[4];
并重建标题:
my $newFastaHeader = ">$accessionId $description";
$seq->id($newFastaHeader);
答案 1 :(得分:3)
使用sed
单行:
sed -r 's/^([^|]+\|){3}//;s/\|//' file
NW_003613580.1 Cricetulus griseus未置入的基因组支架,CriGri_1.0 scaffold329,全基因组鸟枪序列
使用sed
解决方案的好处是,您可以指定要进行替换的行,例如仅使用1s
进行替换,并使用-i
选项将替换存储回来到文件:
sed -ri '1s/^([^|]+\|){3}//;1s/\|//' file
Regexplanation:
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
答案 2 :(得分:2)
也许以下内容会有所帮助:
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
答案 3 :(得分:1)
简短版本:使用split
将序列拆分为数组。
my @parts = split( /\|/, $seq );
然后构建一个字符串以使用数组元素显示。
print $parts[3], ' ', $parts[4], etc....
答案 4 :(得分:1)
这只是在管道字符上拆分原始标题(由可选空格包围)并重新加入所需字段
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
答案 5 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/^([^|]*\|){3}(N[WC]_[0-9.]+)\|/\2/' file