【问题标题】:Split large files by size limit without cutting lines [duplicate]按大小限制拆分大文件而不切割线[重复]
【发布时间】:2026-01-12 07:25:01
【问题描述】:

所以我有兴趣将相当大的文件拆分为 5Gig 间隔。我的目标是让所有分区都小于 5Gigs 和尽可能少的分区。

虽然我通常会使用带有大小限制的拆分,但我需要确保行保持完整(我无法按大小拆分)。

我一直在考虑使用文件大小和行数来确定每个文件可以拆分的行数

例如

File size = 11Gig
File line count = 900
File limit = 5Gig
ceiling(11/5) = 3
900/3 = 300
#Split the file by line limiting 300 each.

虽然这可能通常可行,但由于线元素的性质,如果文件的一部分中有一个非常大的线,文件大小仍可能高于 5gigs。

我正在考虑使用 python(它可以更好地处理数字并且看起来不那么 hackish),但是我会降低 bashes 文件操作的速度。

我想知道是否有人知道 bash 中有更好的替代方案?

提前谢谢你!

【问题讨论】:

  • 900 行不算什么,你可以循环过去。我会遍历每一行,为写入当前文件的字节保留一个计数器。如果当前行超过 5G,则启动一个新文件。如果线路本身超过5G,则抛出错误。 (如果你必须节省内存,这会变得有点复杂,但仍然可能。)
  • Linux 拆分有一个 --lines=NUMBER 选项,可以按每个输出文件的行数拆分。
  • 上面的数字并不是我实际要做的准确比例,它们只是为了提供一个易于理解的例子。

标签: python bash split


【解决方案1】:

来自拆分手册页:

...
-C, --line-bytes=SIZE
put at most SIZE bytes of lines per output file
...

此选项的描述可能不是很明显,但它似乎涵盖了您的要求:文件在达到 SIZE 字节之前在最晚可能的换行符处进行拆分。

【讨论】:

  • 实际上这看起来确实可以解决我的问题。感谢您指出这一点!
  • 不幸的是,这可能会切断线条,即当它们大于SIZE时。我会对一种无论如何都能保持线条完整的解决方案感兴趣......