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

使用awk或sed编写Shell脚本:从成对行提取字段计算差值并追加至文件的方案咨询

用Awk实现需求的最优方案

针对你的需求,用Awk来处理绝对是最简洁高效的选择——它天生就擅长处理这种结构化文本、提取键值对并做计算,完全不用像grep+变量那样绕弯路。下面是直接可用的脚本实现:

#!/usr/bin/awk -f

# 处理start行:提取键名、存值,同时原样输出原行
/^stub-[^-]+-start:/ {
    split($0, arr, /: /)
    key = substr(arr[1], 1, length(arr[1])-6)  # 截掉"-start"后缀,得到stub-foo这类前缀
    start_vals[key] = arr[2]
    print $0
}

# 处理stop行:同样提取键名、存值,原样输出原行
/^stub-[^-]+-stop:/ {
    split($0, arr, /: /)
    key = substr(arr[1], 1, length(arr[1])-5)  # 截掉"-stop"后缀
    stop_vals[key] = arr[2]
    print $0
}

# 原文件里的注释、空行等其他内容,直接输出保留
!/^stub-[^-]+-(start|stop):/ { print $0 }

# 所有行处理完后,追加计算结果
END {
    print "# ..."
    print "# appended:"
    # 遍历所有收集到的键,计算差值并格式化输出
    for (key in start_vals) {
        diff = stop_vals[key] - start_vals[key]
        printf "%s: %d # %d = stop(%d) - start(%d)\n", key, diff, diff, stop_vals[key], start_vals[key]
    }
    print "# new EOF"
}

脚本工作原理拆解

  1. 读取并保留原内容:脚本会逐行读取你的文件,遇到stub-xxx-start或stub-xxx-stop行时,先把对应的值存在关联数组里,同时原样输出这些行;遇到注释、空行等其他内容,直接输出,保证原文件内容完全保留。
  2. 计算并追加内容:当整个文件处理完后(END块),遍历之前收集的所有键名,计算stop值 - start值,然后按照你要求的格式生成新行,追加到文件末尾。

使用步骤

  1. 把上面的代码保存为append_stub_calc.awk文件
  2. 给脚本添加执行权限:chmod +x append_stub_calc.awk
  3. 运行脚本处理你的目标文件(假设目标文件叫stub_config.txt):
    • 输出到新文件(推荐,避免误改原文件):./append_stub_calc.awk stub_config.txt > updated_stub_config.txt
    • 直接覆盖原文件(记得先备份!):./append_stub_calc.awk stub_config.txt > temp.txt && mv temp.txt stub_config.txt

额外说明

  • 不管原文件里start和stop行的顺序如何,只要前缀(比如stub-foo)对应得上,就能正确计算差值。
  • 脚本严格匹配你给出的格式,如果后续有新的stub-xxx-start/stop对,不需要修改脚本,会自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:47:39