SPLIT 1000文件限制的解决方法?

时间:2014-06-17 16:30:59

标签: perl unix awk sed

我需要将几个大文件拆分成特定大小的较小文件,输出500-5000个较小的文件。我正在使用带有-b标识的split,因此我在达到split 1000文件限制时使用手动解决方法。是否有另一个UNIX命令或Perl one-liner将完成此任务?

3 个答案:

答案 0 :(得分:4)

如果我尝试创建大量文件,我会

$ perl -e'print "x"x5000' | split -b 1 && echo done.
split: output file suffixes exhausted

默认情况下,后缀长度为2,允许26 2 = 676个部分。将其增加到3允许26 3 = 17,576份

$ perl -e'print "x"x5000' | split -b 1 -a 3 && echo done.
done.

答案 1 :(得分:4)

您确定1000个文件限制吗?

原始split没有此限制,GNU或BSD版split没有限制。也许你会混淆后缀长度和某种限制。在BSD上,后缀从.aaa开始,一直到.zzz,超过17,000个文件。

如果三个字符后缀不够,您可以使用-a标志来调整后缀大小。

$ split -a 5 $file

答案 2 :(得分:1)

通过设置$/

,可以控制Perl对输入记录的概念
  

$/设置为对整数的引用,标量包含整数,   或者可转换为整数的标量将尝试读取   记录而不是行,最大记录大小为   引用整数个字符。所以这个:

local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;
     

将从$fh读取不超过32768个字符的记录。


因此,要将大文件拆分为不大于1024字节的较小文件,可以使用以下命令:

use strict;
use warnings;

$/ = \1024;
my $filename = 'A';

while (<>) {

    open my $fh, '>', ($filename++ . '.txt') or die $!;
    print $fh $_;
    close $fh or die $!;
}