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

Regex 如何使用perl将一个文件拆分为多个文件?,regex,perl,file-io,split,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 QRFFAGQ

我的文件名为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
我的查询是分开每个版本,并希望用不同的文件名保存每个版本? 我尝试了下面的代码,但我只得到了startsup

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

我想要的输出应该是这两个不同的版本,开始时是这样的>KCY60942和>KCY61710必须保存在不同的文件名中,例如>KCY60942应该保存在一个文件名中,而>KCY61710应该保存在另一个文件名中。

类似这样的东西应该可以做到:

#!/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的文件

我们在输出时打印每一行,每次点击其中一行时关闭和重新打开

如果第一行与此模式不匹配,则存在预匹配文件

还有一个选择:

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 infle

自从每次斋戒开始?记录是段落,$/设置为空以段落模式一次读取一个“记录”文件。捕获每个记录的id作为该记录的文件名,然后将该记录写入其文件


希望这有帮助

你期望的输出是什么?正如我在上面解释的我期望的输出