如何使用Linux拆分将一个多GB的文件分割成大约1.5千兆字节的块?

我有一个可以大于4GB的文件。 我正在使用Linux split命令来拆分它(这是要求)。 但是在拆分原始文件之后,我希望拆分文件的大小始终小于2GB。 原始文件大小可以从3-5 GB变化。 我想在我的shell脚本中为此编写一些逻辑,并将行数送入下面的split命令,以保持分割文件的大小小于2 GB。

 split -l 100000 -d abc.txt abc 

这就是我解决这个问题的方法。 对不起,迟到张贴解决方案。

1.声明一个全局变量DEFAULT_SPLITFILE_SIZE = 1.5Gb

 DEFAULT_SPLITFILE_SIZE=1500000000 

2.计算文件中的行数。

 LINES_IN_FILE=`wc -l $file | awk '{print $1}'` echo `date` "Total word count = ${LINES_IN_FILE}." 

3.计算一个文件的大小。

 FILE_SIZE=`stat -c %s "${file}"` 

4.计算文件中每一行的大小。

 SIZE_PER_LINE=$(( FILE_SIZE / LINES_IN_FILE )) echo `date` "Bytes Per Line = $SIZE_PER_LINE" 

5.计算出使其成为1.5GB分割文件所需的行数。

 SPLIT_LINE=$(( DEFAULT_SPLITFILE_SIZE / SIZE_PER_LINE )) echo `date` "Lines for Split = $SPLIT_LINE" 

将评论转移到答案中。

寻求澄清:典型文件中有多少行? 线长度有多少? 你可以做一些算术,包括一个错误的余地,多少行要求? 你看过你的split命令的选项吗? 是否支持-C选项? (GNU split说: -C, --line-bytes=SIZE put at most SIZE bytes of lines per output file – 这听起来可能是你想要的。

这是我所想的。

  1. wc -l abc.txt – 这会给我在该文件中的行数。
  2. 获取原始文件abc.txt的文件大小并将其除以该文件中的行数; 这会给我每行的大小。
  3. 将每行的大小除以1.5 GB或小于2GB的数字; 那会给我没有线路。
  4. 在我的split命令中使用从第3步获得的行号。

这就是为什么我问了关于文件和行大小的问题。 如果您的文件有很多行长度为10个字节和少于20个字节的行,则可能会遇到问题; 你可能会无意中得到一大块20KB的线,因为它们都被分组在一起。 但是,有可能你的数据足够统一,你不会遇到这样的问题。

考虑是否值得在你的机器上安装GNU split(不是标准问题split ;安装在一个单独的目录下,如/usr/gnu/bin )。

每行文件的行数不同,但我正在处理的其中一个文件有328969322行,文件大小为52.5GB。 是的,我检查了我的split选项,它支持-C选项。 我如何在我的问题中使用它?

我注意到这个数据文件比问题中提到的大小要大得多(大约十倍)。 但是,这不是一个大问题。

 csplit -C 1500000000 datafile 

或者,如果您需要1.5 GB而不是1.5 GB,请使用:

 csplit -C 1610612736 datafile 

当我用csplit -C 20实验时,某些行长度为40个字节,长行被分割(最大长度为20个字节),但较短的行被分组以使文件长达20个字节。 在小数据文件(和块大小的小尺寸)上检查你的代码。

从你给出的数据来看,你的行大概平均每个字节大约有170个字节,所以你不应该有任何的不适当的分裂问题。 如果需要的话,你可以尝试一下类似的东西:

 sed 100q datafile | split -C 1700 - 

这应该给你约10个文件,每个约10行。

发布问题前,请务必参阅手册 。 分割命令提供了一个选项来分割字节上的文件。 以下是您可以在split命令的手册页中找到的选项。

  -b, --bytes=SIZE put SIZE bytes per output file 
 split --bytes=1500000000 abc.txt abc 

您不需要明确指定行数。 这个命令服务于你的目的。