#perl #unix #awk #sed
#perl #unix #awk #sed
Вопрос:
Мне нужно разделить несколько больших файлов на файлы меньшего размера определенного размера, с выводом файлов на 500-5000 файлов меньшего размера. Я использую split
с обозначением a -b, поэтому я использую обходной путь вручную при достижении предела в split
1000 файлов. Есть ли другая команда UNIX или однострочная версия Perl, которая выполнит это?
Комментарии:
1. Можете ли вы настроить ограничение на дескрипторы файлов?
2.
split
У GNU Coreutils нет такого документированного ограничения. Вам нужно настроить длину суффикса, если у вас большое количество файлов.
Ответ №1:
Вы уверены в ограничении на 1000 файлов?
В оригинале split
такого ограничения не было, и для версий GNU или BSD ограничений нет split
. Возможно, вы путаете длину суффикса с каким-то ограничением. В BSD суффикс начинается с .aaa
и продолжается до конца, .zzz
что составляет более 17 000 файлов.
Вы можете использовать -a
флаг для настройки размера суффикса, если трехсимвольного суффикса недостаточно.
$ split -a 5 $file
Ответ №2:
Если я попытаюсь создать много файлов, я получу
$ perl -e'print "x"x5000' | split -b 1 amp;amp; echo done.
split: output file suffixes exhausted
По умолчанию длина суффикса равна двум, что позволяет использовать 26 2 = 676 частей. Увеличение его до трех позволяет получить 26 3 = 17 576 частей
$ perl -e'print "x"x5000' | split -b 1 -a 3 amp;amp; echo done.
done.
Комментарии:
1. (
perl -e'print "x"x5000'
создает файл, состоящий из 5000x
символов.)
Ответ №3:
Можно управлять представлением Perl о входной записи, установив $/
:
Установка
$/
ссылки на целое число, скаляр, содержащий целое число, или скаляр, преобразуемый в целое число, будет пытаться читать записи вместо строк, при этом максимальный размер записи равен целому числу символов, на которое ссылается ссылка. Итак, это:local $/ = 32768; # or "32768", or $var_containing_32768 open my $fh, "<", $myfile or die $!; local $_ = <$fh>;
будет считана запись длиной не более 32768 символов из
$fh
.
Итак, чтобы разделить большой файл на файлы меньшего размера размером не более 1024 байт, можно использовать следующее:
use strict;
use warnings;
$/ = 1024;
my $filename = 'A';
while (<>) {
open my $fh, '>', ($filename . '.txt') or die $!;
print $fh $_;
close $fh or die $!;
}