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

使用Awk匹配模式补全脑区数据overlaps行的问题

修正Awk脚本以补全脑区overlaps记录

问题需求

现有不同脑区的体积数据,要求处理后每个脑区记录都包含对应的overlaps行:

  • 原始数据中已存在overlaps行的脑区,保留原有数据
  • 无overlaps行的脑区,补充[脑区名] overlaps 0 0行

原始数据

LT_Putamen 5075 5075.000000
LT_Temporal 84593 84593.000000
LT_Thalamus 7720 7720.000000
RT_Accumbens 623 623.000000
RT_Accumbens overlaps 64.000000 10.2700
RT_Amygdala 2252 2252.000000
RT_Amygdala overlaps 2133.000000 94.7100

期望输出

LT_Putamen 5075 5075.000000
LT_Putamen overlaps 0 0
LT_Temporal 84593 84593.000000
LT_Temporal overlaps 0 0
LT_Thalamus 7720 7720.000000
LT_Thalamus overlaps 0 0
RT_Accumbens 623 623.000000
RT_Accumbens overlaps 64.000000 10.2700
RT_Amygdala 2252 2252.000000
RT_Amygdala overlaps 2133.000000 94.7100

原脚本问题分析

原脚本的核心问题是没有区分脑区是否已存在overlaps行,切换脑区时和END块都会强制补0行,导致已有overlaps行的脑区被重复输出补全行。

修正后的Awk脚本

awk '{
    # 判断当前行是否为体积行(非overlaps行)
    if ($2 != "overlaps") {
        # 若存在上一个脑区,先输出其体积行和对应overlaps行
        if (prev_region != "") {
            print prev_vol_line
            if (!has_overlaps) {
                printf("%s overlaps 0 0\n", prev_region)
            }
        }
        # 更新当前脑区的信息
        prev_region = $1
        prev_vol_line = $0
        has_overlaps = 0
    } else {
        # 标记当前脑区已有overlaps行,并保存该行内容
        has_overlaps = 1
        overlaps_line = $0
    }
}
END {
    # 处理最后一个脑区的输出
    print prev_vol_line
    if (has_overlaps) {
        print overlaps_line
    } else {
        printf("%s overlaps 0 0\n", prev_region)
    }
}'

脚本逻辑说明

  1. 体积行处理:遇到体积行时,先完成上一个脑区的输出(体积行+补全/原有overlaps行),再记录当前脑区的体积行,重置has_overlaps标记。
  2. overlaps行处理:遇到overlaps行时,标记当前脑区已有有效overlaps数据,并保存该行内容。
  3. END块收尾:处理最后一个脑区的输出,根据has_overlaps状态决定输出原有overlaps行还是补全行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:56:09