根据大小和出现次数将一个文件分成多个文件

时间:2018-06-19 16:49:07

标签: linux file split

我有一个很大的txt文件(〜1GB),其中包含特定文本。

文件内容示例:

Linux中是否有一种方法可以根据大小和出现的时间将此文件拆分为多个文件?

例如,我想将文件拆分为100 MB的文件,但是每个文件必须以特定字符开头,并且文件之前的最后一行必须是原始文件中该字符之前的行文件。 请注意,此字符在原始文件中经常存在,因此拆分文件的大小将匹配。

编辑:您可以从此处下载txt文件:[示例文件] [2]

1 个答案:

答案 0 :(得分:1)

由于结果文件不完全匹配,因此regexp需要一些调整。将其运行为:perl scriptname.pl

#!/usr/bin/perl -w

use strict;
use IO::File;


my $all = join('', (<STDIN>));

my (@pieces) = ($all =~ m%([IZO]\(.*?\)\{.*?\r\n\}\r\n)%gsx);

my $n = 1;
my $FH;
foreach my $P (@pieces) {
   if ($P =~ m%^I%) {
      undef $FH;
      $FH = IO::File->new(sprintf("> chunk%d", $n));
      $n++;
   }
   print $FH $P;
}

更少的内存不足:

#!/usr/bin/env python

import sys

def split(filename, size=100, outputPrefix="xxx"):
    with open(filename) as I:
        n = 0
        FNM = "{}{}.txt"
        O = open(FNM.format(outputPrefix, n), "w")
        toWrite = size*1024*1024
        for line in I:
            toWrite -= len(line)
            if line[0] == 'I' and toWrite < 0:
                O.close()
                toWrite = size*1024*1024
                n += 1
                O = open(FNM.format(outputPrefix, n), "w")
            O.write(line)
        O.close()

if __name__ == "__main__":
    split(sys.argv[1])

使用:python scriptname.py sample.txt 所有串联的文件都等于sample.txt