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

在Bash中实现当前行第2列与上一行第3列的差值计算及追加输出

解决Bash中跨行计算并追加结果的Awk方案

需求与问题

需求:在Bash环境中,将每行第2列的值减去上一行第3列的值,并将计算结果追加到当前行末尾输出。

用户尝试的Awk代码(未实现跨行取值逻辑):

awk '{a=$3; b=$2; c=a-b;print $0,c;}' input.bed

输入示例

NC_048323.1 21 29
----------------------
NC_048323.1 62 65
----------------------
NC_048323.1 128 179
--------------------
NC_048323.1     204     238
--------------------------
NC_048323.1     296     392
--------------------------
NC_048323.1     427     448
---------------------------
NC_048323.1     477     507
---------------------------

期望输出

NC_048323.1     21      29    21
---------------------------------
NC_048323.1     62      65    33
---------------------------------
NC_048323.1     128     179   63
---------------------------------
NC_048323.1     204     238   25
---------------------------------
NC_048323.1     296     392   58
---------------------------------
NC_048323.1     427     448   35
---------------------------------
NC_048323.1     477     507   29
---------------------------------

正确实现代码

awk '
    BEGIN {prev_col3=0}
    /^NC_/ {
        diff = (NR == 1) ? $2 : ($2 - prev_col3)
        printf "%-20s %-8s %-8s %d\n", $1, $2, $3, diff
        prev_col3 = $3
    }
    !/^NC_/ {print}
' input.bed

代码说明

  • 初始化变量:BEGIN块中初始化prev_col3,用于存储上一行的第3列值
  • 处理数据行:匹配以NC_开头的有效数据行:
    • 第一行无前置行,直接取第2列作为结果
    • 后续行计算当前第2列与prev_col3的差值
    • 用printf格式化输出,保证列对齐效果与期望输出一致
    • 更新prev_col3为当前行第3列,供下一行计算使用
  • 处理分隔线:非数据行(分隔线)直接原样输出

原代码问题分析

原代码中每次循环仅使用当前行的第2、3列计算差值,没有保存上一行的第3列值,完全未实现跨行取值的逻辑,因此无法得到正确结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:20:17