如何使用perl将一个文件拆分成多个文件?

时间:2015-06-30 09:55:34

标签: regex perl file-io split

我的文件为ftp.txt,其中包含许多版本的行,例如

>KCY60942 pep:novel supercontig:GCA_000682575.1:ab248605.contig.36_1:19:588:-1 gene:J738_3590 transcript:KCY60942 description:"putative transposase 1"
MTHLNELYLILNKYLKWNKSHLKCFALIMLVIILKQTCNLSSASKALPIKCLPQSFYRRM
QRFFAGQYFDYRQISQLIFNMFSFDQVQLTLDRTNWKWGKRNINILMLAIVYRGIAIPIL
WTLLNKRGNSDTKERIALIQRFIAIFGKDRIVNVFADREFIGEQWFTWLIEQDINFCIRV
KKTSLSPII

>KCY61710 pep:novel supercontig:GCA_000682575.1:ab248605.contig.22_1:4164:6320:1 gene:J738_2986 transcript:KCY61710 description:"tonB-dependent siderophore receptor family protein"
MQRTTKHFQINALALAIAMSTISAHAETDQQTSEYGTLPTIKVKAGSGQENEKSYIAGKT
DTAVPLGLSVREVPQSVSVITQQRLQDQQLSTLVEVAENVTGVSVNRYETNRGGIYSRGF
VVDNYIIDGIPTTYSLPWSSGEIFSSMALYDHIDVVRGATGLTFGAGNPSAAINMVRKRA
TSTEPTANVEVSAGSWDNYRVMGDIANSLNQSGTVRGRAVAQYEQGDSYTDLLSKEKLSL
LLSAEADLSENTLLSGGVTYQEDDPRGPMWGGLPVWFSDGTKTNWSKNITTSADWTRWNV
KYTNLFADLTHKFNDNWSAKLSYSHGKRDANSKLLYVSGSVDKNTGLGLSPYASAYDLEV
EQDNASLQLNGSFDLWGLEQKVVLGYQYSNQDFTAYARSTDTKMEIGNFFEWNGSMPEPV
WNAPTLNEKYNIEQNALFAATYLNPIEPLKFILGGRFTNYEKNIYGRSSSIKYDHEFVPY
AGIIYDFNDVYTAYASYTSIFQPQDKKDFDGNYLDPVEGNSTEVGLKSAWFDGRLNGTLA
LYHIKQDNLAQEAGDVTRNGVKEIYYRAAKGATSEGFEVEVSGQITPDWNITAGYSQFSA
KDTNDVDVNTQLPRKMIQTFTTYKLSGKLENITVGGGVNWQSSTYINAENPKEVIEKVEQ
GDYALVNLMARYQITKDFSAQLNINNVFDKKYYGVFPAYGQITLGAPRNAALTLQYKF

我的查询是将每个版本分开并希望将每个版本保存为不同的文件名? 我尝试了下面的代码,但我只得到启动的行

#!/usr/local/bin/perl
open( FILE, "/home/httpd/cgi-bin/r/ftp.txt" );
while ( $line = <FILE> ) {
    if ( $line =~ m/^\>/g ) {
        print $line;
    }
}

我想要的输出应该是那两个不同的版本,它们的开头是这样的&gt; KCY60942和&gt; KCY61710必须保存在不同的文件名中,例如&gt; KCY60942应该保存在一个文件名中,并且&gt; KCY61710它应该保存在另一个文件名。

2 个答案:

答案 0 :(得分:1)

这样的事情可以解决问题:

#!/usr/local/bin/perl

use strict;
use warnings;

open( my $file, "<", "/home/httpd/cgi-bin/r/ftp.txt" );
open( my $output, ">", "pre-match" ) or die $!;

while ( my $line = <$file> ) {
    if ( $line =~ m/^\>/g ) {
        my ($output_name) = ( $line =~ m/^\>(\w+)/ );
        close($output);
        open( $output, ">", $output_name . ".output" ) or die $!;
    }
    print {$output} $line;
}

close($output);

如果您的行与该正则表达式匹配,我们会“挑出”第一个单词(KCY61710等)并打开一个名为KCY61710.output的文件。

我们在进行此输出时打印每一行,每当我们点击其中一行时关闭并重新打开。

如果第一行与此模式不匹配,则存在pre-match文件。

答案 1 :(得分:1)

这是另一种选择:

use strict;
use warnings;

local $/ = '';

while (<>) {
    my ($fileName) = /^>([^\s]+)/;
    open my $fh, '>', "$fileName.txt" or die "Can't write to '$fileName.txt'";
    print $fh $_;
    close $fh;
}

用法:perl script.pl inFile

由于每个(FASTA?)记录都是一个段落,$/设置为空('')以段落模式读取文件 - 一次一个'记录'。捕获每个记录的id以用作该记录的文件名,然后将该记录写入其文件。

希望这有帮助!