如何在Bash中拆分带表头的大型*.csv文件?
问题分析与解决
错误原因很明确:你在输出文件名里直接使用了带完整路径的${FILENAME},导致生成的文件名变成part-1-/home/.../my_file.csv.csv,系统无法识别这种包含斜杠的文件名格式,因此报错“不存在该文件或目录”。
修正后的脚本
FILENAME=/home/cnf/domains/cnf.com.pl/public_html/sklep/dropshipping-pliki/products-files/my_file.csv # 提取纯文件名,剥离完整路径 MY_FILE=$(basename ${FILENAME}) HDR=$(head -1 ${FILENAME}) split -l 40000 ${FILENAME} xyz n=1 for f in xyz* do OUTPUT_FILE="part-${n}-${MY_FILE}" if [[ ${n} -ne 1 ]]; then echo "${HDR}" > ${OUTPUT_FILE} fi cat ${f} >> ${OUTPUT_FILE} rm ${f} ((n++)) done
关键修改点
- 用
basename命令提取FILENAME的纯文件名(比如my_file.csv),避免把完整路径塞进输出文件名。 - 新增
OUTPUT_FILE变量统一管理输出文件名,提升脚本可读性。 - 给
echo "${HDR}"加上双引号,防止表头中的特殊字符(如空格、逗号)被Shell拆分。
额外优化建议
- 若希望拆分后的文件和原文件同目录,可添加目录路径前缀:
FILE_DIR=$(dirname ${FILENAME}) OUTPUT_FILE="${FILE_DIR}/part-${n}-${MY_FILE}" - 使用
split -d参数生成数字后缀的临时拆分文件(如xyz00、xyz01),比默认的字母后缀更直观。
内容的提问来源于stack exchange,提问作者D_P
相关产品推荐
相关产品推荐

