如何将文件拆分为n个零件

new*_*son 28 split file

我有一个文件包含一些没有行.我希望将文件拆分为具有特定名称的n个文件.每个文件中存在多少行并不重要.我只想要特别的no.of文件(比如5).这里的问题是原始文件中的行号不断变化.所以我需要计算没有行,然后将文件分成5个部分.如果可能,我们必须将它们分别发送到不同的目录中.

小智 39

在bash中,您可以使用该split命令根据所需的行数对其进行拆分.您可以使用wc命令确定所需的行数.这里wc结合了split一行.

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

    split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4
Run Code Online (Sandbox Code Playgroud)

这将创建像onepiece.split.log0000... 这样的文件

注意:bash部分向下舍入,所以如果有剩余部分则会有第6部分文件.

  • **split -da 4 -l $((`wc -l <​​onepiece.log`/5))onepiece.log部分--additional-suffix =".log"**这将以直观的方式命名文件 - 即part0001.log,part0002.log等,而不是split的默认命名.-da 4表示我们需要一个长度为4的数字后缀.阅读"man split"以获得更多自定义选项.PS:在评论中吃掉了背景 (13认同)
  • 为了处理余数,如果像我这样的人想要固定数量的文件作为输出但使用循环分配的行,那么上面的命令可以修改为:**split -da 4 -nr/1024 filename filename_split --附加后缀 =“.log”**。将 1024 替换为您想要作为输出的文件数。 (2认同)

mik*_*iku 6

在linux上,有一个split命令,

split --lines=1m /path/to/large/file /path/to/output/file/prefix
Run Code Online (Sandbox Code Playgroud)

输出固定大小的INPUT到PREFIXaa,PREFIX,...; 默认大小为1000行,默认PREFIX为"x".没有INPUT,或INPUT为 - 时,读取标准输入.

...

-l, - lines = NUM​​BER为每个输出文件放置NUMBER行

...

但是,您必须事先计算拆分的实际大小.


bjg*_*bjg 6

假设您正在处理文本文件,然后wc -l确定总行数并split -l分成指定的行数(在您的情况下总计/ 5).这适用于UNIX/Mac和Windows(如果你安装了cygwin)


Har*_*old 6

split 有一个选项“--number=CHUNKS”,可让您将文件分成多个块。这是来自“split --help”的(修剪)输出:

  -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
Run Code Online (Sandbox Code Playgroud)

在将其分成 5 部分的情况下,命令将是: split --number=l/5 inputfile outputprefix

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

如果您希望它们在最后一行之前都具有相同的行数,则可以使用以下命令: 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
Run Code Online (Sandbox Code Playgroud)

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