Perl正则表达式匹配'>'

时间:2015-03-27 08:52:38

标签: regex perl seq

这是我的文件中数据的排列方式。

>Contig1
TGGCACCTTCGACAGTTGCTCCCTCCTGGGTGGGGGCCGTCTGACCTCGCTGTACTCCT
>Contig2
GGGCCTTGGGAAGCGCAGGTGCCGAGAACTTGGCTAGAGCGGTAGACAATGCGGTTCGTG
AAAAGAGCAACTTTAAATACTTGTACGACCTCAACCAGCCAGTCAAAGAGAAAATCGAG
>NODE_105957_length_443_cov_1.000000
TCAGAAGTTAATGCAATCTGGTCCATTAAGTAAATGGGTATCATGGTACATAAACTAAAA
GCACAGAACATGGATTATTTTCCCAATTTTAACTTTCCTAACCATTTTTATCTCTCTCAA
TAACTTCCACAGTAGTTTTTATTCGTCTCAATAACTTTATTAAAAGGGATCCCTCTATCC
CCAGAATTCAGTAGCTGCATACGACTTTCCTGTCACTAGAGATCCCTCAGATGTCGGTAG
TGCATTCATCTTAAGTGATAAATCAAATGTTAGTCAAGTTAGGAAGTGAGAATTGATACA
GAATTTCTACTTCAATACTAGCTATCCCAAAATGGTCATTGACGATTTATTTTTTTCCTA
CCAGCATATTCTTTTCTAGTATTTCAGATCTAGTGACTCAGAACTAGGACAATCATAAAT
TTGAAGGGAACCTTAAGTCTTTTTTCATGCTGAGACTGCCAAG
>NODE_105950_length_95_cov_1.000000
TCAGGTCCTACTTCATTTGTAAGGAAAACTGACAGGTAATTCAGTGGGACAGAATACCAT
GTGAAGAGTTTCCTCTCACCTGAGAGGAGACTTTTTGATGATGATGATGATCAAT

请告诉我如何提取序列,即只有A,T,G,C的行,每行连续序列之间有一个换行符。这是我到目前为止的代码

#!/usr/bin/perl

print "Enter the first filename\n";
$filename = <>;

print "Enter the output file for ids\n";
$filename1 = <>;

print "Enter the output file for sequences\n";
$filename2 = <>;
my $first = ">";
open(FILE, $filename) or die "Could not read from $filename, program halting.";
open(FIL, '>', $filename1) or die "Could not read from $filename1, program halting.";
open(FILES, '>', $filename2) or die "Could not read from $filename2, program halting.";
while(my $line = <FILE>)
{
    if ($line =~ m//s) 
        {
            print FILES $line, "\n";
        } 
    if ($line =~ m/^>/)
        {
            print FIL $line;
        }
}
close FILE;
close FIL;
close FILES;

这只是一个基本的常规,简单的perl程序来匹配模式。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

你可以使用这个正则表达式

/^[ATGC]+$/gm

演示https://regex101.com/r/rQ9gN4/2

如果你想提取

  

NODE_105957_length_443_cov_1.000000   NODE_105950_length_95_cov_1.000000

否定上述正则表达式

/^([^ATGC]+)$/gm

答案 1 :(得分:1)

尝试使用:

#!/usr/bin/perl

# ALLWAYS
use strict;
use warnings;

print "Enter the first filename\n";
chomp (my $filename = <>); # remove the line break

print "Enter the output file for ids\n";
chomp (my $filename1 = <>); # remove the line break

print "Enter the output file for sequences\n";
chomp (my $filename1 = <>); # remove the line break

# use three args open and show the reason when it fails
open(my $FILE,  '<', $filename)  or die "Unable to open '$filename', $!";
open(my $FILE1, '>', $filename1) or die "Unable to open '$filename1', $!";
open(my $FILE2, '>', $filename2) or die "Unable to open '$filename2', $!";

while(my $line = <$FILE>) {
    chomp($line);   # remove line break
    if ($line =~ /^>/) {
        print $FILE1 $line,"\n";
        # add a line break to filename2 unless we are at first line.
        print $FILE2 "\n" unless $. < 2;
    }
    else {
        print $FILE2 $line;
    }
}