File 如何将文件拆分为n个部分

File 如何将文件拆分为n个部分,file,split,File,Split,我有一个包含几行的文件。我要将文件拆分为n个具有特定名称的文件。每个文件中有多少行并不重要。我只需要特定数量的文件(比如5个)。这里的问题是原始文件中的行数不断变化。所以我需要计算行数,然后把文件分成5部分。如果可能,我们必须将它们发送到不同的目录。在linux上,有一个命令 将固定大小的输入输出到PREFIXaa、PREFIXab、。。。;默认大小为1000行,默认前缀为“x”。如果没有输入,或输入为-,则读取标准输入 -l、 --行数=行数 为每个输出文件设置行数 不过,您必须事先计算拆

我有一个包含几行的文件。我要将文件拆分为n个具有特定名称的文件。每个文件中有多少行并不重要。我只需要特定数量的文件(比如5个)。这里的问题是原始文件中的行数不断变化。所以我需要计算行数,然后把文件分成5部分。如果可能,我们必须将它们发送到不同的目录。

在linux上,有一个命令

将固定大小的输入输出到PREFIXaa、PREFIXab、。。。;默认大小为1000行,默认前缀为“x”。如果没有输入,或输入为-,则读取标准输入

-l、 --行数=行数 为每个输出文件设置行数


不过,您必须事先计算拆分的实际大小。

假设您正在处理一个文本文件,然后
wc-l
确定总行数,并
split-l
拆分为指定的行数(在您的情况下为总行数/5)。这适用于UNIX/Mac和Windows(如果已安装)

我可以想出几种方法来实现这一点。你会用哪一种取决于数据

  • 行的长度是固定的:通过读取文件的目录条目找到文件的大小,然后除以行的长度得到行的数量。使用此选项确定每个文件的行数

  • 这些文件只需要具有大致相同的行数。再次从目录项读取文件大小。读取前N行(N应该很小,但文件的某个合理部分)以计算平均行长度。根据文件大小和预测的平均行长度计算近似行数。这假设线路长度服从正态分布。如果没有,请调整方法以随机采样线(使用seek()或类似方法)。在获得平均值后倒带文件,然后根据预测的行长度将其拆分

  • 把文件读两遍。第一次计算行数。第二次将文件拆分为必需的部分


  • 编辑:使用shell脚本(根据您的评论),随机版本的#2将很难实现,除非您编写了一个小程序为您实现这一点。您应该能够使用
    ls-l
    来获取文件大小,
    wc-l
    来计算精确的行数,
    head-nNNN | wc-c
    来计算平均行长。

    在bash中,您可以使用
    split
    命令根据所需的行数对其进行拆分。您可以使用
    wc
    命令计算所需的行数。这里的
    wc
    split
    组合成一行

    例如,将
    onepiece.log
    拆分为5个部分

        split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4
    
    split-l$(`wc-l
    这将创建类似于
    onepiece.split.log0000
    的文件


    注意:bash除法向下舍入,因此如果有余数,将有一个第六部分文件。

    这是基于@sketchytechky和@grasshopper给出的原始答案。如果您希望以不同的方式处理余数,并希望以固定数量的文件作为输出,但以循环方式分发行,则split命令应编写为:

    split-da 4-n r/1024文件名\u split--附加后缀=“.log”
    。将1024替换为您想要作为输出的文件数。

    split有一个选项--number=CHUNKS”,可以将文件分成若干个块。 这是“split--help”的(修剪过的)输出:

    如果将其拆分为5个部分,则命令为:
    split--number=l/5输入文件输出前缀

    不过,这可能不会导致它们具有相同的行数

    如果希望它们在最后一行之前具有相同的行数,可以使用以下命令:
    split-l$(($(cat“inputfile”| wc-l)+5-1)/5))inputfile outputprefix
    这里的两个5都可以替换为任何其他数字(确保它们相同)

    下面是对该命令的逐条解释:

    $()
    返回您输入的任何命令的输出。cat用于确保wc只返回行数,而不输出输入文件名

    $(())
    将括号之间的内容作为数学表达式计算(仅使用整数)并返回结果

    ($(cat“inputfile”| wc-l)+5-1)/5
    获取输入文件的行计数并加5,减1,然后将结果除以5。除法之前的加法和减法确保结果向上取整,以便精确给出所需的零件数(本例中为5)

    您还可以使用
    split--number=r/5
    将其拆分为四个文件,其中每一行分布在它们之间,如下例所示:

    inputfile.txt:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    outputfile1:
    1
    6
    
    outputfile2:
    2
    7
    
    outputfile3:
    3
    8
    
    outputfile4:
    4
    9
    
    outputfile5:
    5
    

    这不会保留文件顺序。但在不重要的情况下,它可能很有用。

    使用什么?一个工具,一种编程语言,一个脚本?Windows、Linux?您有什么可用的语言?这会按行或字节分割?这里的文件大小也会每天更改。。所以我需要一个一般的答案,我们不应该使用任何大小或行数,我必须为此编写一个shell脚本。有人能帮我一下吗sintax
    --lines=1m
    ?split-da 4-l$((
    wc-l
    /5))onepiece.log部分-附加后缀=“.log”这将以直观的方式命名文件-即part0001.log、part0002.log等,而不是split的默认命名-da 4表示我们需要一个长度为4的数字后缀。有关更多自定义选项,请阅读“手动拆分”。附言:所以,请吃了评论中的反讽。这个答案比
      -n, --number=CHUNKS     generate CHUNKS output files; see explanation below
    
    ...
    
    CHUNKS may be:
    N       split into N files based on size of input
    K/N     output Kth of N to stdout
    l/N     split into N files without splitting lines
    l/K/N   output Kth of N to stdout without splitting lines
    r/N     like 'l' but use round robin distribution
    r/K/N   likewise but only output Kth of N to stdout
    
    inputfile.txt:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    outputfile1:
    1
    6
    
    outputfile2:
    2
    7
    
    outputfile3:
    3
    8
    
    outputfile4:
    4
    9
    
    outputfile5:
    5