如何按大小分割大文件而不影响UNIX中的最后一行?

时间:2018-12-12 13:16:28

标签: shell unix sh

例如,源文件的大小为1 gb,包含25000行,我想分割大小为100 mb的文件。由于大小限制,我需要带有整行的小文件,而不需要1个文件中的部分行,而其他文件中的其余部分行。提前致谢。如果我的问题感到困惑,请告诉我。

3 个答案:

答案 0 :(得分:2)

@bodo的split -C是更好的解决方案,但是如果没有,您可以在使用awk的同时计算字符数,并在每次访问时都滚动到新的输出文件100 * 1024 * 1024个字符的输出。

请注意,这里暗含每个字符1个字节的假设-请注意是否使用多字节字符等。

awk '{
   # Total up length of this line plus a line-feed
   t=t+length($0)+1
   # If we have reached 100MB, roll over the chunk number and zero tally
   if(t>100*1024*1024){c+=1;t=0}
   # Write current line to file "chunk-NNN.txt"
   print >> "chunk-" (c+1) ".txt"
}' YourFile.txt

答案 1 :(得分:1)

如果您的split命令支持选项-C size--line-bytes=size(请参阅man split),则可以使用

split -C 100M inputfile

答案 2 :(得分:0)

我不相信这么简单:

在我的PC上,我有一个名为“ prebuild.txt”的文件。为了知道大小,我做ls -l(可以解析):

Prompt>ls -s prebuild.txt
135868 prebuild.txt

因此,大小约为135,868 Mb。

可以使用wc -l找到行数:

Prompt>wc -l prebuild.txt
424358 prebuild.txt

为了将其切成±100Mb,我需要知道百分比:

Prompt>$ echo 100*100000/135868 | bc
73.6

因此,我需要大约73.6%的文件。相应的行数:

echo 73.6*424358/100 | bc
312327,488

只需将文件的前312327行放入file1.txt中即可:

head -312327 prebuild.txt >file1.txt

其余的操作可以在原始文件的提醒行上使用headtail进行,直到不再有任何内容为止。

P.s。我没有测试与bc相关的命令(我没有在系统上安装bc,基本计算器)。