linux 的split命令如何确保split出来的多个文件,每个文件都 带上原始文件开头的第一行

本文详细介绍了如何编写和使用Bash脚本split_with_header.sh,包括原始代码实现、赋予可执行权限以及正确的调用方法,旨在帮助用户理解文件分割过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、调用方式

./split_with_header.sh 原始文件名 每个文件的行数

2、原始代码

split_with_header.sh如下

#!/bin/bash
set -x

# 确保脚本接收了正确数量的参数
if [ "$#" -lt 2 ]; then
  echo "Usage: $0 <file> <lines_per_file> [output_prefix]"
  exit 1
fi

# 读取命令行参数
FILE=$1
LINES_PER_FILE=$2
OUTPUT_PREFIX=${3:-x}  # 如果没有提供第三个参数,则默认前缀为'x'

# 提取文件的第一行
HEADER=$(head -n 1 "$FILE")

# 生成当前目录下的临时文件名,避免和现有文件冲突
TMP_FILE=$(mktemp ./tmp.XXXXXX)

# 从原始文件中移除第一行
tail -n +2 "$FILE" > "$TMP_FILE"

# 分割文件,注意split命令中的输出前缀逻辑
if [ -z "$3" ]; then
  # 如果没有提供输出前缀,按split默认行为,此时TMP_FILE路径用于前缀
  split -l "$LINES_PER_FILE" "$TMP_FILE" "$OUTPUT_PREFIX"
else
  # 如果提供了输出前缀,使用该前缀
  split -l "$LINES_PER_FILE" "$TMP_FILE" "${OUTPUT_PREFIX}"
fi

# 将第一行添加到每个分割后的文件
for file in ${OUTPUT_PREFIX}*; do
  # 使用中间临时文件来避免直接修改循环中的文件
  { echo "$HEADER"; cat "$file"; } > "${file}.tmp" && mv "${file}.tmp" "$file"
done

# 清理临时文件
rm "$TMP_FILE"

echo "分割完成。"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值