如何在不影响unix中最后一行的情况下按大小拆分大文件



例如,源文件是1GB,有25000行,我想拆分大小阈值为100MB的文件。由于大小限制,我需要一个文件中有整行而不是部分行的小文件,以及其他文件中剩余的部分行。提前谢谢。如果我的问题混淆了,请告诉我。

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

split -C 100M inputfile

@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

我不相信它有那么简单:

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

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

因此,其大小约为135868Mb。

使用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,直到什么都不剩为止。

附言:我没有测试与bc相关的命令(我的系统上没有安装bc,基本计算器(。

相关内容

最新更新