如何保存匹配和不匹配的FASTA序列

时间:2017-08-31 12:12:04

标签: regex perl

我有一个像这样的FASTA序列的文件

 >seq002
 ATGGTAAATGGTTTCTCAAATTGTGCACTGACAGACAAACCCCT
 >seq0009
 ATGGCGTCAAAGGTGATGCCGTCAGCGTCAACAACTAA
 >seq0001
 ATGGGAAATAGTGAGGACGGGAAATCTTTAG
 >seq0003
 ATGGGATCTTACTTGAACTTCAAGAATTGA
>seq00005
GCTAATTTTGAGGTTTACCCAGATAGCTG

我试图用ATG提取序列开始并以TAG / TGA / TAA结束。我将此代码用于我的目的

#!/usr/bin/perl -w
# This script reads several sequences and print the sequence which don't strat with ATH and ends with TAG/TGA/TAA

use strict; 

my $infile = "id.fasta";# This is the file path
open INFILE, $infile or die "Can't open $infile: $!"; # This opens file, but if file isn't there it mentions this will not open

my $outfile = "full_length_seq.txt";# This is the file's output
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # This opens the output file, otherwise it mentions this will not open

my $sequence = ();  # This sequence variable stores the sequences from the .fasta file
my $line;                             # This reads the input file one-line-at-a-time

while ($line = <INFILE>) {
    chomp $line;# This removes "\n" at the end of each line (this is invisible)

    if($line =~m/^ATG[GTAC]+T(GA|AA|AG)$/g) { # This finds lines matching with pattern
        next;

      }

    print OUTFILE $line, "\n";
}

产生这样的结果

>seq002
>seq0009
>seq0001
>seq0003
>seq00005
GCTAATTTTGAGGTTTACCCAGATAGCTG

但我想创建两个不同的文件,如

>seq002
 ATGGTAAATGGTTTCTCAAATTGTGCACTGACAGACAAACCCCT
 >seq0009
 ATGGCGTCAAAGGTGATGCCGTCAGCGTCAACAACTAA
 >seq0001
 ATGGGAAATAGTGAGGACGGGAAATCTTTAG
 >seq0003
 ATGGGATCTTACTTGAACTTCAAGAATTGA

>seq00005
GCTAATTTTGAGGTTTACCCAGATAGCTG

任何提示或帮助都将非常感激。感谢。

1 个答案:

答案 0 :(得分:1)

所以诀窍是 - 你现在正在分割换行和逐行工作。

但您不必 - 您可以使用$/代替,并将其设置为合适的分隔符。

我建议你这样做,你需要"\n>",因为那时它会把你的东西分块。

然后,你需要略微改变你的模式匹配,因为现在每个'chunk'是两行。

这样的事情:

#!/usr/bin/env perl

use strict;
use warnings;

local $/ = "\n>";

open my $outfile, '>', 'full_length_seq.txt' or die $!;
open my $other_outfile, '>', 'everything_else.txt' or die $!;


while ( <DATA> ) { 
    chomp;
    s/^>//g; #remove leading >, because first line doesn't have a linefeed in front. 

    #just for some diagnostics - print what we're currently operating on. 
    print "New chunk:\n";
    print;
    print "\nEnd\n";


    if ( /\nATG[GTAC]+T(GA|AA|AG)$/ ) {
        print "**matches**\n";
        print {$other_outfile} ">",$_,"\n";
    }
    else {
        print {$outfile} ">", $_, "\n";
    }

}

__DATA__
>seq002
ATGGTAAATGGTTTCTCAAATTGTGCACTGACAGACAAACCCCT
>seq0009
ATGGCGTCAAAGGTGATGCCGTCAGCGTCAACAACTAA
>seq0001
ATGGGAAATAGTGAGGACGGGAAATCTTTAG
>seq0003
ATGGGATCTTACTTGAACTTCAAGAATTGA
>seq00005
GCTAATTTTGAGGTTTACCCAGATAGCTG

这给了我们一个文件:

>seq002
ATGGTAAATGGTTTCTCAAATTGTGCACTGACAGACAAACCCCT
>seq00005
GCTAATTTTGAGGTTTACCCAGATAGCTG

另一个用:

>seq0009
ATGGCGTCAAAGGTGATGCCGTCAGCGTCAACAACTAA
>seq0001
ATGGGAAATAGTGAGGACGGGAAATCTTTAG
>seq0003
ATGGGATCTTACTTGAACTTCAAGAATTGA

我使用上面的__DATA__作为插图 - 您应该仍然可以读取输入文件,或者只使用<>来读取“STDIN或在命令行上命名的文件”(如grep / sed等。)

另外我建议使用3个参数打开lexical文件句柄作为更好的样式。 E.g。

open ( my $infile, '<', 'id.fasta' ) or die $!;