请求实现基于指定大小分割.csv文件的Shell脚本方案
按指定大小分割大CSV文件的Shell脚本方案
刚好之前处理过类似的大CSV分割需求,给你一个经过验证的Shell脚本方案,不仅能按指定大小分割,还能保证每个输出文件都带CSV表头,避免数据无法直接使用的问题。
完整脚本
#!/bin/bash # 配置参数 SOURCE_FILE="location.csv" OUTPUT_PREFIX="location_" # 设置每个分割文件的大小,支持K/M/G等单位(这里设为2G) FILE_SIZE="2G" # 检查源文件是否存在 if [ ! -f "$SOURCE_FILE" ]; then echo "错误:源文件 $SOURCE_FILE 不存在!" exit 1 fi # 提取CSV表头(第一行) HEADER=$(head -n 1 "$SOURCE_FILE") # 创建临时目录存放分割后的无表头文件 TMP_DIR=$(mktemp -d) echo "使用临时目录:$TMP_DIR" # 分割源文件(跳过表头,按指定大小分割) tail -n +2 "$SOURCE_FILE" | split -d -b "$FILE_SIZE" - "$TMP_DIR/${OUTPUT_PREFIX}" # 给每个分割后的文件添加表头,并重命名为最终的.csv文件 COUNT=1 for TMP_FILE in "$TMP_DIR"/${OUTPUT_PREFIX}*; do if [ -f "$TMP_FILE" ]; then # 先写入表头,再追加分割的数据 echo "$HEADER" > "${OUTPUT_PREFIX}${COUNT}.csv" cat "$TMP_FILE" >> "${OUTPUT_PREFIX}${COUNT}.csv" echo "已生成文件:${OUTPUT_PREFIX}${COUNT}.csv" ((COUNT++)) fi done # 清理临时目录 rm -rf "$TMP_DIR" echo "分割完成,共生成 $((COUNT-1)) 个文件"
脚本关键说明
- 表头处理:CSV文件的表头是核心信息,直接用
split会导致只有第一个文件带表头,后面的文件数据无意义。脚本先提取表头,再分割数据部分,最后给每个输出文件追加表头。 - 分割逻辑:用
tail -n +2跳过源文件的第一行(表头),然后通过split -d -b "$FILE_SIZE"按指定大小分割,-d参数让分割后的临时文件使用数字后缀(00、01...)。 - 临时目录:用
mktemp -d创建安全的临时目录,避免分割过程中污染当前工作目录,执行完成后自动清理。 - 参数灵活:你可以修改
FILE_SIZE变量来调整每个分割文件的大小,比如1G、500M都支持,完全适配你的需求。
使用步骤
- 将上述脚本保存为
split_csv.sh。 - 给脚本添加执行权限:
chmod +x split_csv.sh。 - 确保
location.csv和脚本在同一目录,或者修改SOURCE_FILE变量为文件的绝对路径。 - 运行脚本:
./split_csv.sh。
执行完成后,你就会得到location_1.csv到location_5.csv共5个2G左右的文件,每个文件都包含完整的CSV表头和对应的数据。
内容的提问来源于stack exchange,提问作者Madhankkumar S A
相关产品推荐
相关产品推荐

