Mac下如何将50GB CSV分割为1GB大小的gzip压缩文件?
分割50GB CSV文件为1GB大小的gzip压缩文件
当然可以实现,你的命令出错主要有两个原因:
- 单位参数错误:
-b 1000000000g表示的是1000000000GB,完全不符合需求,正确的1GB写法是1G或1073741824(精确字节数)。 - 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
相关产品推荐
相关产品推荐

