awk匹配两个文件中的两个字段

时间:2015-02-06 03:31:14

标签: awk comparison matching

我想找到file1中的字段1和2与file2中的字段2和3匹配的行,然后从file2打印所有字段。 file2中的行多于file1

File1中

rs116801199 720381 
rs138295790 16057310
rs131531 16870251
rs131546 16872281
rs140375 16873251
rs131552 16873461

文件2

--- rs116801199 720381 0.026 0.939 0.996 0 -1 -1 -1                                                                            
1 rs12565286 721290 0.028 1.000 1.000 2 0.370 0.934 0.000                                                                      
1 rs3094315 752566 0.432 1.000 1.000 2 0.678 0.671 0.435                                                                       
--- rs3131972 752721 0.353 0.906 0.938 0 -1 -1 -1                                                                              
--- rs61770173 753405 0.481 0.921 0.950 0 -1 -1 -1   

我尝试过类似的事情:

awk -F 'FNR==NR{a[$1];b[$2];next} FNR==1 || ($2 in a && $3 in b)' file1 file2 > test

但是语法错误

1 个答案:

答案 0 :(得分:1)

考虑:

awk -F 'FNR==NR{a[$1];b[$2];next} FNR==1 || ($2 in a && $3 in b)' file1 file2

选项-F需要一个参数,但没有故意提供参数。结果是awk将整个代码解释为字段分隔符。这就是为什么代码没有按预期运行的原因。

从问题陈述中,我没有看到为什么FNR==1应该在代码中。所以,我删除了它。一旦完成,不需要parens。如果是这种情况,则代码进一步简化为:

$ awk 'FNR==NR{a[$1];b[$2];next} $2 in a && $3 in b' file1 file2 
--- rs116801199 720381 0.026 0.939 0.996 0 -1 -1 -1