2013-05-13 70 views
0

我有一個多fasta文件,從中需要提取100-200的鹼基,包括其相應的標題。我知道'cut -c 100-200'可以在沒有相應標題的情況下完成。有沒有辦法在Perl或bash中做到這一點?在100-200之間選擇鹼基並將它們與標題一起打印

示例文件:

8YS68_00009_00025 GAGTTTGATCCTGGCTCAGAGCGAACGCTGGCGGCAGGCTTAACACATGCAAGTCGAGCGGGCGTAGCAATACGTCAGCGGCAGACGGGTGAGTAACGCGTGGGAACATACCTTTTGGTTCGGAACAACACAGGGAAACTTGTGCTAATACCGGATAAGCTACGGGAAGATT 8YS68_00009_00027 GAGTTTGATCATGGCTCAGAGCGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAGCGCCGTAGCAATACGGAGCGGCAGACGGGTGAGTAACGCGTGGGAACGTACCTTTCGGTTCGGAATAACTCAGGGAAACTTGAGCTAATACCGAATACGTCCGTAAGGAGAAAGATTTATCGCCGAAAGATCGGCCCGCGTAAGATTAGCTAGTTGGTGAGGTAAGGCTCACCAAGCGACGATCGTTAGCTTGTC 8YS68_00012_00035 GAGTTTGATCATGGCTCAGAACGAACGTTGGCGGCGTGGATTAG GCATGCAAGTCGAACGAATCCCATCTGGGTAACTGGGTGGGGGAAGTGGCGAAAGGGGCAGTAATGCGTGGGTAACCTACCTGGGGACCGGGATAGCCTCCTAACGGATGGGTAATACCGGATACGACCTTCGGAGGCATCTCCTGAAGG

所需的輸出: SEQ ID ------ ----- ATCGATCGATCG

SEQ ID ------ ----- ATCGATCGATCG

序列編號 ------ ATCGATCGATCG -----

這意味着,我想要精確地提取100-200之間的鹼基每個序列以及它們的標題。如果序列短於100 bp,則忽略它。

+0

你能給出一個簡短的輸入/期望的輸出樣本嗎? – 2013-05-13 12:32:06

+0

這不是[FASTA格式](http://en.wikipedia.org/wiki/FASTA_format)。如果你的數據實際上缺少標識符前面的「>」,那麼下面的方法都不會起作用。 – SES 2013-05-14 13:35:06

回答

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

}

謝謝大家的幫助和支持。

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 
+0

謝謝史蒂夫。不幸的是,這也給出了非排序的標題;即使沒有相應的序列,也會打印標題。如何解決這個問題? – Ronn 2013-05-13 13:20:56

+0

我以爲你說你有一個multi-fasta文件?您將需要定義非序列。根據上面的評論,請[編輯](http://stackoverflow.com/posts/16520781/edit)您的問題,包括示例數據和預期輸出。 – Steve 2013-05-13 13:32:53

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) 
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

相關問題