求可按首列匹配合并两制表符分隔文件的Bash脚本
解决方法
先梳理你原awk命令的几个核心问题:
- 数组赋值逻辑错误:
a[$1]=($2,$5,$7)里的逗号是awk的表达式分隔符,这行实际只会把$7的值存入数组,而非$2、$5、$7的组合,需要用分隔符拼接三个字段后存储。 - 多余无效的END块:
END { print($2 in a)}完全没有意义,END块执行时已遍历完所有文件,$2无实际指向,逻辑也不符合需求。 - 缺失不匹配场景的处理:没有定义当File1的ID在File2中不存在时的输出规则。
正确的Awk命令
以下命令可实现你的需求:
awk ' BEGIN { FS=OFS="\t" } # 指定输入输出分隔符为制表符 FNR==NR { # 处理File2,将第2、5、7字段用制表符拼接后存入数组 a[$1] = $2 OFS $5 OFS $7 next } # 处理File1 { if ($1 in a) { # 匹配时输出原行+对应字段 print $0, a[$1] } else { # 不匹配时输出原行+NO MATCH print $0, "NO MATCH" } } ' File2 File1
命令解释
BEGIN { FS=OFS="\t" }:明确指定输入和输出的字段分隔符为制表符,确保和你的文件格式一致。FNR==NR:该条件仅在处理第一个文件(File2)时成立,此时将每个ID对应的第2、5、7字段用制表符拼接后存入数组a,键为ID。- 处理第二个文件(File1)时,判断当前行ID是否在数组
a中:- 存在则输出当前整行+数组中存储的对应字段;
- 不存在则输出当前整行+
NO MATCH。
测试结果
用你提供的测试文件运行该命令,输出完全符合预期:
ID1 -5.1 -4.4 juice ill,safe F25B9 ID2 -6.2 -3.8 NO MATCH ID3 -8.9 -7.1 apple block,use G27H1 ID4 -14.6 -7.8 NO MATCH
内容的提问来源于stack exchange,提问作者AnnRi
相关产品推荐
相关产品推荐

