awk双文件处理问题:按配置文件提取特征对应指定列
问题分析与解决思路
需求回顾
咱们有两个文件需要处理:
result.txt:每行包含名称、特征、Min、Median、Max,列对应关系是第2列=特征,第3列=Min,第4列=Median,第5列=MaxApple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90config.txt:每行定义特征需要提取的属性(Min/Median/Max)fruits Max vehicle Median study Min
最终要实现的是:根据config.txt的规则,从result.txt中提取对应特征的指定属性值,输出格式如下:
Apple fruits 30 Car vehicle 50 Book study 70
现有代码的问题
你当前的awk脚本逻辑有两处关键问题:
awk 'FNR==NR{arr[$2];next} $1 in arr {var =$2;print var}' result.txt config.txt
- 映射关系搞反了:你把
config.txt的第2列(属性)存到数组里,然后判断result.txt的第1列(名称)是否在数组中,这完全不符合需求——咱们需要的是result.txt的第2列(特征)对应config.txt的第1列(特征)。 - 缺少属性到列号的映射:就算拿到了特征对应的属性,你也没记录这个属性对应
result.txt中的哪一列,自然没法提取对应的值。
解决思路
咱们调整一下处理逻辑,分两步走:
- 先处理
config.txt:建立「特征→要提取的属性」的映射关系,比如fruits对应Max,vehicle对应Median。 - 再处理
result.txt:对每一行,根据第2列的特征找到对应的属性,再把属性转换成result.txt中的列号(Min→3,Median→4,Max→5),最后输出需要的列。
完整实现脚本
下面是修正后的awk脚本:
# 第一步:处理config.txt,构建特征到目标属性的映射 FNR == NR { feat_attr[$1] = $2 # $1是特征,$2是要提取的属性(Min/Median/Max) next } # 第二步:处理result.txt { # 检查当前行的特征($2)是否在config的映射中 if ($2 in feat_attr) { # 根据属性确定对应的列号 switch(feat_attr[$2]) { case "Min": col = 3; break case "Median": col = 4; break case "Max": col = 5; break } # 输出名称、特征、对应属性的值 print $1, $2, $col } }
运行命令:
awk -f script.awk config.txt result.txt
(注意:这里要把config.txt放在前面,因为咱们是先处理它构建映射)
验证结果
运行后就能得到预期的输出:
Apple fruits 30 Car vehicle 50 Book study 70
内容的提问来源于stack exchange,提问作者RATNESH TIWARI
相关产品推荐
相关产品推荐

