обходной путь для ограничения файлов с разделением на 1000?

#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' создает файл, состоящий из 5000 x символов.)

Ответ №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 $!;
}