使用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) } }'
脚本逻辑说明
- 体积行处理:遇到体积行时,先完成上一个脑区的输出(体积行+补全/原有overlaps行),再记录当前脑区的体积行,重置
has_overlaps标记。 - overlaps行处理:遇到overlaps行时,标记当前脑区已有有效overlaps数据,并保存该行内容。
- END块收尾:处理最后一个脑区的输出,根据
has_overlaps状态决定输出原有overlaps行还是补全行。
内容的提问来源于stack exchange,提问作者Marcins
相关产品推荐
相关产品推荐

