Linux split命令保留表头表尾并动态更新表尾计数的实现
拆分带表头与统计尾行的CSV文件需求及实现
需求说明
- 原始CSV文件包含:表头行、多行数据行、表尾行(格式为
T|N,其中N为数据总行数) - 需按5MB大小拆分文件
- 每个拆分后的文件必须保留表头行,且表尾行的计数要对应该文件内的数据行数
当前使用的split命令(无法满足需求)
split -d -a3 -b 5M --additional-suffix=_$(date '+%Y%m%d%H%M%S').CSV TEST-REPORT-D-INR-TEMP_20230905211012.CSV TEST-REPORT-D-INR-TEMP_
示例原始文件
H|INR|TEST|YYYYMMDDHHMMSS DATALINE1 DATALINE2 DATALINE3 DATALINE4 DATALINE5 T|5
期望拆分结果
文件1
H|INR|TEST|YYYYMMDDHHMMSS DATALINE1 DATALINE2 T|2
文件2
H|INR|TEST|YYYYMMDDHHMMSS DATALINE3 DATALINE4 T|2
文件3
H|INR|TEST|YYYYMMDDHHMMSS DATALINE5 T|1
解决方案:使用Shell脚本实现
split命令无法自动添加表头和动态生成统计尾行,可通过Shell脚本结合工具完成需求:
#!/bin/bash # 配置参数 INPUT_FILE="TEST-REPORT-D-INR-TEMP_20230905211012.CSV" CHUNK_SIZE="5M" DATE_SUFFIX=$(date '+%Y%m%d%H%M%S') OUTPUT_PREFIX="TEST-REPORT-D-INR-TEMP_" # 提取表头 HEADER=$(head -n 1 "$INPUT_FILE") # 提取所有数据行(去掉表头和表尾) DATA_LINES=$(sed '1d;$d' "$INPUT_FILE") # 临时存储数据行的文件 TEMP_DATA=$(mktemp) echo "$DATA_LINES" > "$TEMP_DATA" # 拆分数据行文件,按大小拆分 split -d -a3 -b "$CHUNK_SIZE" --additional-suffix="_${DATE_SUFFIX}.CSV" "$TEMP_DATA" "${OUTPUT_PREFIX}tmp_" # 处理每个拆分后的临时文件,添加表头和统计尾行 for tmp_file in "${OUTPUT_PREFIX}tmp_"*; do # 生成最终文件名(替换tmp_为空白) final_file="${tmp_file/tmp_/}" # 统计当前文件的数据行数 line_count=$(wc -l < "$tmp_file") # 写入表头、数据行、统计尾行 echo "$HEADER" > "$final_file" cat "$tmp_file" >> "$final_file" echo "T|$line_count" >> "$final_file" # 删除临时文件 rm "$tmp_file" done # 清理临时数据文件 rm "$TEMP_DATA"
脚本说明
- 提取表头:用
head -n1获取原始文件第一行作为表头 - 提取数据行:用
sed '1d;$d'去掉原始文件的表头和表尾,仅保留数据行 - 拆分数据行:用
split按指定大小拆分纯数据行的临时文件 - 生成最终文件:遍历每个拆分后的临时数据文件,添加表头,统计当前文件的数据行数并生成对应表尾行,最后整理文件名
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

