我有一个多fasta文件,我需要从中提取100-200的基数,包括它们相应的标题。我知道'cut -c 100-200'可以在没有相应标题的情况下完成。有没有办法在Perl或bash中执行此操作?
示例文件:
8YS68_00009_00025 GAGTTTGATCCTGGCTCAGAGCGAACGCTGGCGGCAGGCTTAACACATGCAAGTCGAGCGGGCGTAGCAATACGTCAGCGGCAGACGGGTGAGTAACGCGTGGGAACATACCTTTTGGTTCGGAACAACACAGGGAAACTTGTGCTAATACCGGATAAGCTACGGGAAGATT 8YS68_00009_00027 GAGTTTGATCATGGCTCAGAGCGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGCCGTAGCAATACGGAGCGGCAGACGGGTGAGTAACGCGTGGGAACGTACCTTTCGGTTCGGAATAACTCAGGGAAACTTGAGCTAATACCGAATACGTCCGTAAGGAGAAAGATTTATCGCCGAAAGATCGGCCCGCGTAAGATTAGCTAGTTGGTGAGGTAAGGCTCACCAAGCGACGATCGTTAGCTTGTC 8YS68_00012_00035 GAGTTTGATCATGGCTCAGAACGAACGTTGGCGGCGTGGATTAGGCATGCAAGTCGAACGAATCCCATCTGGGTAACTGGGTGGGGGAAGTGGCGAAAGGGGCAGTAATGCGTGGGTAACCTACCTGGGGACCGGGATAGCCTCCTAACGGATGGGTAATACCGGATACGACCTTCGGAGGCATCTCCTGAAGG
期望的输出: seq id ------ ----- ATCGATCGATCG
seq id ------ ----- ATCGATCGATCG
seq id ------ ----- ATCGATCGATCG
这意味着,我想准确地提取每个序列100-200之间的基础以及它们的标题。如果序列短于100 bp,则忽略它。
答案 0 :(得分:1)
使用 Bio::SeqIO ,以下代码将从100提取到200并打印标题。
#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;
my $in_file = "fasta_dat.txt";
my $in = Bio::SeqIO->new (-file=> $in_file, -format=>'fasta');
my $out = Bio::SeqIO->new( -file => '>test.fasta',
-format => 'fasta');
while(my $seq = $in->next_seq() ) {
my $subseq = $seq->trunc(100, 200);
$out->write_seq($subseq);
}
更新:或者只是采用choroba的解决方案here
答案 1 :(得分:0)
如果您想要的输出是另一个multi-fasta文件,那么您只需要awk
一点。只需substring你想要的东西。
awk '!/^>/ { print substr($0, 100, 100); next }1' file.fa
最后的1
返回true,启用文件中所有行的默认打印。其余的应该是自我解释的。 HTH。
awk '/^>/ { h = $0; getline; print h RS substr($0, 100, 100) }' file.fa
或没有getline
:
awk '/^>/ { h = $0; next } h { print h RS substr($0, 100, 100); h = "" }' file.fa
答案 2 :(得分:0)
也许您可以使用以下python脚本:
import sys,re
i,list1 =0,[]
for line in open(sys.argv[1]):
if re.match(r'^[>|;]',line): print line,
else:
for x in line:
if x != "\n": i+=1
if 100 < i < 200: list1.append(x)
print "".join(list1)
答案 3 :(得分:0)
在查看了这些建议并在这个问题上工作了一段时间之后,我在Perl中找到了一个解决方案。这是我在Perl中完成工作的重要“循环”,我写道。
my $seq = '';
my $head ;
while (my $seq = <IN>) {
if ($seq =~ m/^>/){
$head = $seq;
}
else{
my $dna .=$seq;
my $subseq = substr ($seq, 100, 100);
my $size = length($subseq);
if ($size > 99){
print OUT "$head";
print OUT "$subseq";
}
}
}
谢谢大家的帮助和支持。