如何使用bash脚本将CSV按指定列拆分为制表符分隔的多份sheet
Bash脚本实现CSV按列范围拆分为多sheet/多文件
前置说明
本方案适配SQL导出的标准CSV格式,若CSV字段无内嵌逗号、换行、双引号等特殊字符,可直接使用无额外依赖的纯bash方案;若存在特殊字段格式,推荐使用csvkit工具处理避免拆分错位。
方案1:纯bash拆分输出多个独立CSV文件(无额外依赖)
无需安装第三方工具,直接调用系统原生命令实现拆分:
#!/bin/bash # 配置项 INPUT_CSV="Sample.csv" # 替换为你的CSV文件路径 DELIMITER="," # 若为制表符分隔则改为$'\t' # 拆分规则:格式为"列范围:输出文件名",列序号从1开始计数 SPLIT_RULES=( "1-3:sheet1_基础信息.csv" "4-5:sheet2_用户国家.csv" "6-7:sheet3_支持信息.csv" # 190列可按需求继续追加规则 ) # 执行拆分 for rule in "${SPLIT_RULES[@]}"; do IFS=":" read -r col_range output_file <<< "$rule" cut -d "$DELIMITER" -f "$col_range" "$INPUT_CSV" > "$output_file" echo "已生成:$output_file" done
使用前可执行head -1 Sample.csv | tr ',' '\n' | nl查看所有列对应的序号,方便配置拆分范围。
方案2:生成单个XLSX文件(内含多个sheet)
如果需要输出为单个Excel文件、每个拆分范围对应一个sheet,需先安装依赖:
# 安装csvkit工具 pip install csvkit
拆分脚本如下:
#!/bin/bash # 配置项 INPUT_CSV="Sample.csv" OUTPUT_XLSX="拆分结果.xlsx" DELIMITER="," # 拆分规则:格式为"列范围:sheet名称" SPLIT_RULES=( "1-3:基础信息" "4-5:用户国家" "6-7:支持信息" ) TEMP_DIR="./.temp_csv_split" mkdir -p "$TEMP_DIR" # 拆分生成临时CSV文件 for rule in "${SPLIT_RULES[@]}"; do IFS=":" read -r col_range sheet_name <<< "$rule" csvcut -d "$DELIMITER" -c "$col_range" "$INPUT_CSV" > "$TEMP_DIR/$sheet_name.csv" done # 合并为多sheet Excel csvmerge --output "$OUTPUT_XLSX" --prefix-sheet-names 0 "$TEMP_DIR"/*.csv # 清理临时文件 rm -rf "$TEMP_DIR" echo "已生成多sheet Excel文件:$OUTPUT_XLSX"
内容的提问来源于stack exchange,提问作者Saranya
相关产品推荐
相关产品推荐

