You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac下如何将50GB CSV分割为1GB大小的gzip压缩文件?

分割50GB CSV文件为1GB大小的gzip压缩文件

当然可以实现,你的命令出错主要有两个原因:

  1. 单位参数错误:-b 1000000000g 表示的是1000000000GB,完全不符合需求,正确的1GB写法是1G或1073741824(精确字节数)。
  2. split版本不支持--filter:从系统返回的使用说明来看,你用的是BSD版本的split,该版本没有--filter选项(这是GNU split的特性)。

针对不同split版本的解决方案

1. 如果你使用的是GNU split(Linux系统默认)

修正参数即可,直接指定输入文件比用cat更高效:

split -b 1G -d -a4 test.csv output_prefix --filter='gzip > $FILE.gz'

参数说明:

  • -b 1G:设置每个分割块的大小为1GB
  • -d:使用数字作为文件后缀(而非默认字母)
  • -a4:指定后缀长度为4位(比如output_prefix0000.gz)
  • --filter='gzip > $FILE.gz':将每个分割块直接通过gzip压缩输出

2. 如果你使用的是BSD split(比如macOS系统)

由于BSD split不支持--filter,可以用dd结合循环实现:

input_file="test.csv"
chunk_size=$((1024*1024*1024))  # 1GB对应的字节数
prefix="output_prefix"
count=0

while true; do
    suffix=$(printf "%04d" $count)
    # 读取指定位置的1GB数据块并压缩
    dd if="$input_file" bs="$chunk_size" skip="$count" count=1 2>/dev/null | gzip > "${prefix}${suffix}.gz"
    # 如果dd读取失败(已到文件末尾),删除空文件并退出循环
    if [ $? -ne 0 ]; then
        rm -f "${prefix}${suffix}.gz"
        break
    fi
    count=$((count+1))
done

额外提示

如果需要保证每个分割后的文件都是完整的CSV行(避免行被截断),不能直接按字节分割。这种情况下可以先估算1GB对应的大概行数,用split -l按行数分割后再压缩,但这样每个文件的大小会略有差异。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:32