选择介于100 -200之间的基础并将其与标题一起打印

时间:2013-05-13 11:17:43

标签: perl bash

我有一个多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,则忽略它。

4 个答案:

答案 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";
        } 
  }

}

谢谢大家的帮助和支持。