You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

脚本说明

  1. 提取表头:用head -n1获取原始文件第一行作为表头
  2. 提取数据行:用sed '1d;$d'去掉原始文件的表头和表尾,仅保留数据行
  3. 拆分数据行:用split按指定大小拆分纯数据行的临时文件
  4. 生成最终文件:遍历每个拆分后的临时数据文件,添加表头,统计当前文件的数据行数并生成对应表尾行,最后整理文件名

内容的提问来源于stack exchange,提问作者Ashok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:35:17