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

使用awk计算相邻行首列差值 按阈值输出第三列数据范围

awk实现相邻数值列范围提取方案

需求梳理

处理四列结构的数值数据文件,规则如下:

  • 逐行计算第一列相邻两个数值的差值,若差值绝对值≤设定阈值,输出两行对应第三列数值组成的范围,格式为xxx-xxx \
  • 若存在连续3行及以上、且所有相邻行第一列差值都满足阈值要求,额外输出该连续段首尾第三列值组成的总范围
  • 示例阈值为0.01,示例数据的期望输出为四组相邻两行的范围,无长连续段额外输出

可直接使用的awk命令

阈值通过-v thresh=xxx参数传入,可按需修改,命令如下:

awk -v thresh=0.01 '
NR == 1 {
    prev_c1 = $1
    prev_c3 = $3
    seg_start = $3
    seg_pairs = 0
    next
}
{
    diff = $1 - prev_c1
    diff = diff < 0 ? -diff : diff
    if (diff <= thresh) {
        printf "%d-%d \\\n", prev_c3, $3
        seg_pairs++
    } else {
        if (seg_pairs >= 2) {
            printf "%d-%d \\\n", seg_start, prev_c3
        }
        seg_start = $3
        seg_pairs = 0
    }
    prev_c1 = $1
    prev_c3 = $3
}
END {
    if (seg_pairs >= 2) {
        printf "%d-%d \\\n", seg_start, prev_c3
    }
}
' 你的数据文件路径

逻辑说明

  • 初始化阶段(第一行):记录第一行的第一列、第三列值作为初始参考值,标记连续段起始位置,初始化连续满足条件的相邻对计数为0
  • 逐行处理阶段:
    • 计算当前行与上一行第一列的差值绝对值,和阈值比对
    • 差值符合要求时,先输出当前相邻两行的第三列范围,累计连续相邻对计数
    • 差值不符合要求时,先判断之前的连续段是否满足「连续3行及以上」(对应连续相邻对计数≥2),满足则输出总范围;之后重置连续段标记和计数
    • 更新上一行的参考值为当前行内容
  • 收尾阶段(文件读取完成):检查文件末尾是否存在未结算的长连续段,满足条件则补输出总范围

测试验证

用提供的示例数据运行上述命令,输出结果和期望完全一致:

631-632 \
974-975 \
2020-2021 \
3181-3180 \

如果存在连续5行满足阈值要求、对应第三列值为631、632、633、634、635的场景,会先输出4组相邻范围,最后额外输出总范围631-635 \,符合规则要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:45:32