如何使用awk基于三个条件匹配两个文件并输出对应结果
awk按指定区间条件匹配两个文件的解决方案
原有命令错误原因
- 将file2的各列拆分存储到独立一维数组,当file2存在多条第1列相同的记录时,后写入的记录会覆盖数组中已有的值,仅能保留最后一条同列值的记录
- 条件判断中
b[$2]、c[$3]的索引使用错误,无法对应到同一行file2记录的区间起止值
正确实现命令
awk 'NR==FNR{ arr[$1][++cnt[$1]] = $2" "$3" "$4 next } { res = 0 if($2 in cnt){ for(i=1;i<=cnt[$2];i++){ split(arr[$2][i],tmp," ") if($3 >= tmp[1] && $3 <= tmp[2]){ res = tmp[3] break } } } print $0,res }' file2 file1
命令逻辑说明
- 优先读取file2,以第1列(和file1第2列匹配的关联键)为一级索引,将同一关联键下的所有区间起始值、区间结束值、对应第四列值打包存储到二维数组,避免同关联键多区间的覆盖问题
- 读取file1时,默认匹配结果设为0;遍历当前行第2列对应的所有file2区间,判断file1第3列是否落在区间范围内,匹配成功则更新结果为对应第四列值并跳出循环
- 最终输出file1整行内容加匹配结果,完全符合预期输出格式
内容的提问来源于stack exchange,提问作者godines
相关产品推荐
相关产品推荐

