File 如何将文件拆分为n个部分
我有一个包含几行的文件。我要将文件拆分为n个具有特定名称的文件。每个文件中有多少行并不重要。我只需要特定数量的文件(比如5个)。这里的问题是原始文件中的行数不断变化。所以我需要计算行数,然后把文件分成5部分。如果可能,我们必须将它们发送到不同的目录。在linux上,有一个命令 将固定大小的输入输出到PREFIXaa、PREFIXab、。。。;默认大小为1000行,默认前缀为“x”。如果没有输入,或输入为-,则读取标准输入 -l、 --行数=行数 为每个输出文件设置行数File 如何将文件拆分为n个部分,file,split,File,Split,我有一个包含几行的文件。我要将文件拆分为n个具有特定名称的文件。每个文件中有多少行并不重要。我只需要特定数量的文件(比如5个)。这里的问题是原始文件中的行数不断变化。所以我需要计算行数,然后把文件分成5部分。如果可能,我们必须将它们发送到不同的目录。在linux上,有一个命令 将固定大小的输入输出到PREFIXaa、PREFIXab、。。。;默认大小为1000行,默认前缀为“x”。如果没有输入,或输入为-,则读取标准输入 -l、 --行数=行数 为每个输出文件设置行数 不过,您必须事先计算拆
不过,您必须事先计算拆分的实际大小。假设您正在处理一个文本文件,然后
wc-l
确定总行数,并split-l
拆分为指定的行数(在您的情况下为总行数/5)。这适用于UNIX/Mac和Windows(如果已安装)我可以想出几种方法来实现这一点。你会用哪一种取决于数据
编辑:使用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