Хорошо, поэтому - взять какой-то ввод, разделить его на 5
, а затем разбить фрагменты на отдельные файлы?
На самом деле добавить «лишнее» в последний файл немного сложнее, чем кажется, так как вам нужно прочитать все сначала , прежде чем вы сможете узнать распределение, но довольно легко выполнить циклический перебор вывода :
5
. $.
Что-то вроде:
#!/usr/bin/env perl
use strict;
use warnings;
my $num_files_to_write = 4;
use Data::Dumper;
my @filehandles;
for my $id ( 1..$num_files_to_write ) {
open ( my $fh, '>', "file_$id.txt" ) or die $!;
push @filehandles, $fh;
}
local $/ = '5';
while ( <> ) {
select $filehandles[$. % $num_files_to_write];
print;
}
foreach my $fh ( @filehandles ) {
close ( $fh );
}
Примечание - не совсем то, что вы хотели, потому что «первый» блок равен нулю, но ваш первый номер файла равен 1. Это так же просто, как добавить / вычитая из $. + 1%, например, $ num_files_to_write
. Но это зависит от того, заботитесь ли вы, какой именно файл что получит, или это просто вопрос разделения.
Вы не можете, как уже было сказано , если файлы были сжаты стандартным gzip
]. Если у вас есть контроль над сжатием, вы можете использовать dictzip
для сжатия файлов, он сжимает файлы в отдельных блоках, и вы можете распаковать только последний блок (обычно 64 КБ). И он обратно совместим с gzip
, что означает, что файл, сжатый в формате dictzip, также является совершенно легальным файлом в формате gzip.
Другая возможность: если вы получите gzip-файл как объединение нескольких уже сжатых gzip-файлов, вы сможете найти последнюю подпись gzip и распаковать все после этого.