使用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
相关产品推荐
相关产品推荐

