【问题标题】:workaround for SPLIT 1000 file limit?SPLIT 1000 文件限制的解决方法?
【发布时间】:2014-06-18 00:50:29
【问题描述】:

我需要将几个大文件拆分为特定大小的小文件,输出 500-5000 个小文件。我正在使用带有 -b 名称的 split,因此当达到 split 1000 文件限制时,我正在使用手动解决方法。是否有另一个 UNIX 命令或 Perl 单行代码可以完成此操作?

【问题讨论】:

  • 你能调整你的文件句柄限制吗?
  • 来自 GNU Coreutils 的 split 没有这样的记录限制。如果你有大量文件,你必须调整后缀长度。

标签: perl unix awk sed


【解决方案1】:

您确定 1000 个文件的限制吗?

原来的split 没有这样的限制,split 的 GNU 或 BSD 版本也没有限制。也许您将后缀长度与某种限制混淆了。在 BSD 上,后缀从 .aaa 开始,一直到 .zzz,即超过 17,000 个文件。

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

$ split -a 5 $file

【讨论】:

    【解决方案2】:

    如果我尝试创建大量文件,我会得到 ​​p>

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

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

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

    【讨论】:

    • perl -e'print "x"x5000' 创建包含 5,000 个 x 字符的文件。)
    【解决方案3】:

    可以通过设置$/ 来控制 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 $!;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2019-06-02
      • 2019-05-27
      相关资源
      最近更新 更多