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

How to split one file into multiple files using perl?

我有 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);

如果您的行与该正则表达式相匹配,我们将 'pick out' 第一个单词(因此 KCY61710 等)并打开一个名为 KCY61710.output 的文件。

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

存在一个 pre-match 文件以防第一行与此模式不匹配。

还有一个选项:

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?) 记录都是一个段落,$/ 设置为空 ('') 以段落模式读取文件——一次一个 'record' .捕获每条记录的 ID 用作该记录的文件名,然后将该记录写入其文件。

希望对您有所帮助!