【BASH 常用脚本系列 1 -- 将一个文件从第 N 行开始分成两个文件】

请阅读【嵌入式开发学习必备专栏 】


文章目录

    • [将一个文件从第 N 行开始分成两个文件](#将一个文件从第 N 行开始分成两个文件)

将一个文件从第 N 行开始分成两个文件

要在 shell 中将一个文件从第 n 行开始分成两个文件,可以使用 headtail 命令。下面是一个示例脚本,该脚本接收三个参数:源文件名、行号 n 和目标文件前缀。脚本将创建两个文件:一个包含开始到第 n-1 行的内容,另一个包含第 n 行到文件末尾的内容。

sh 复制代码
#!/bin/bash
# 参数检查
if [ "$#" -ne 3 ]; then
    echo "Usage: $0 <source file> <line number> <destination prefix>"
    exit 1
fi
# 输入参数
source_file=$1
line_number=$2
dest_prefix=$3
# 计算源文件的总行数
total_lines=$(wc -l < "$source_file")
# 验证行号是否有效
if [ "$line_number" -lt 1 ] || [ "$line_number" -gt "$total_lines" ]; then
    echo "Error: Line number is out of range."
    exit 1
fi
# 从开始到第 n-1 行
head -n $((line_number - 1)) "$source_file" > "${dest_prefix}_part1.txt"
# 从第 n 行到文件末尾
tail -n +$line_number "$source_file" > "${dest_prefix}_part2.txt"
echo "File has been split into '${dest_prefix}_part1.txt' and '${dest_prefix}_part2.txt'."

将此脚本保存为 split_file.sh 并给它执行权限:

sh 复制代码
chmod +x split_file.sh

然后使用如下命令执行脚本:

sh 复制代码
./split_file.sh inputfile.txt 10 outputfile

这里 inputfile.txt 是需要分割的源文件,10 是行号 noutputfile 是目标文件的前缀。执行这个脚本将会创建 outputfile_part1.txtoutputfile_part2.txt 两个文件,分别包含源文件的第1行到第9行和第10行到末尾的内容。

如果想根据多个行号将文件分割成多个部分,可以使用下面的脚本来实现。假设 传入的行号已经按照从小到大的顺序排列,并且不包括文件的最后一行(因为 tail 可以用来处理到文件末尾的情况):

sh 复制代码
#!/bin/bash
# 检查参数数量
if [ $# -lt 2 ]; then
    echo "Usage: $0 <source file> <line number 1> [line number 2] ... [line number N]"
    exit 1
fi
# 获取源文件名和行号列表
source_file=$1
shift
line_numbers=("$@")
# 记录上一个行号,初始化为文件开始
last_line_num=0
# 文件分割标识
file_index=1
# 遍历所有行号,分割文件
for line_num in "${line_numbers[@]}"; do
    # 计算行的范围
    start_line=$((last_line_num + 1))
    end_line=$((line_num - 1))
    
    # 切割文件的对应行范围
    if [ $start_line -le $end_line ]; then
        sed -n "${start_line},${end_line}p;${end_line}q" "$source_file" > "${source_file}_part${file_index}"
    else
        # 如果两个行号相同或逆序,则创建一个空文件
        touch "${source_file}_part${file_index}"
    fi
    
    # 更新最后行号为当前行号
    last_line_num=$line_num
    ((file_index++))
done
# 最后,从最后一个行号到文件末尾
tail -n +$((last_line_num + 1)) "$source_file" > "${source_file}_part${file_index}"

要运行此脚本,请将其保存到文件(例如 split_by_lines.sh),然后使其可执行:

sh 复制代码
chmod +x split_by_lines.sh

之后, 可以像这样调用它:

sh 复制代码
./split_by_lines.sh yourfile.txt 10 20 30

上述命令将 yourfile.txt 分割为四个部分:

  • yourfile.txt_part1 包含行 1 到 9
  • yourfile.txt_part2 包含行 10 到 19
  • yourfile.txt_part3 包含行 20 到 29
  • yourfile.txt_part4 包含行 30 到文件末尾
    请注意, 应该确保传入的行号是有效的,且按照升序排列。如果两个连续的行号相同或者是逆序的,脚本将为这部分创建一个空文件
相关推荐
IT_陈寒7 小时前
Vite vs Webpack:5个让你的开发效率翻倍的实战对比
前端·人工智能·后端
wuhen_n8 小时前
TypeScript 强力护航:PropType 与组件事件类型的声明
前端·javascript·vue.js
wuhen_n8 小时前
组件设计原则:如何设计一个高内聚、低耦合的 Vue 组件
前端·javascript·vue.js
Moment19 小时前
Vibe Coding 时代,到底该选什么样的工具来提升效率❓❓❓
前端·后端·github
IT_陈寒21 小时前
SpringBoot性能飙升200%?这5个隐藏配置你必须知道!
前端·人工智能·后端
小时前端21 小时前
React性能优化的完整方法论,附赠大厂面试通关技巧
前端·react.js
Nicko1 天前
Jetpack Compose BOM 2026.02.01 解读与升级指南
前端
小蜜蜂dry1 天前
nestjs学习 - 控制器、提供者、模块
前端·node.js·nestjs
优秀稳妥的JiaJi1 天前
基于腾讯地图实现电子围栏绘制与校验
前端·vue.js·前端框架
前端开发呀1 天前
从 qiankun(乾坤) 迁移到 Module Federation(模块联邦),对MF只能说相见恨晚!
前端