使用 awk 匹配两个不同文件中的数字

Posted

技术标签:

【中文标题】使用 awk 匹配两个不同文件中的数字【英文标题】:Matching numbers in two different files using awk 【发布时间】:2014-05-25 17:21:30 【问题描述】:

我有两个文件(f1 和 f2),都由三列组成,长度不同。我想通过以下方式创建一个包含四列的新文件:

f1             f2
1 2 0.2        1 4 0.3
1 3 0.5        1 5 0.2
1 4 0.2        2 3 0.6
2 2 0.5        
2 3 0.9

如果前两列中的数字出现在两个文件中,那么我们打印每个文件的前两个数字和第三个数字(例如,两者都有1 4,f3 中应该有1 4 0.2 0.3;否则,如果 f2 中缺少前两个数字,则只需在第四列中打印一个零。

这些例子的完整结果应该是

f3
1 2 0.2 0
1 3 0.5 0
1 4 0.2 0.3
2 2 0.5 0
2 3 0.9 0.6

我写的脚本如下:

awk 'str1=$1; str2=$2; str3=$3; 
     getline < "f2"; 
     if($1==str1 && $2==str2)
        print str1,str2,str3,$3 > "f3";
     else
        print str1,str2,str3,0 > "f3";
' f1

但它只是查看相同的两个数字是否在同一行中(它不会遍历所有 f2 文件)作为结果给出

1 2 0.2 0
1 3 0.5 0
1 4 0.2 0
2 2 0.5 0
2 3 0.9 0

【问题讨论】:

【参考方案1】:

这个 awk 应该可以工作:

awk 'FNR==NRa[$1,$2]=$3;next print $0, (a[$1,$2])? a[$1,$2]:0' f2 f1
1 2 0.2 0
1 3 0.5 0
1 4 0.2 0.3
2 2 0.5 0
2 3 0.9 0.6

【讨论】:

以上是关于使用 awk 匹配两个不同文件中的数字的主要内容,如果未能解决你的问题,请参考以下文章

AWK:使用两个匹配条件的文件和计数相等的唯一标识符

AWK 比较两个文件中的两列输出匹配行 - 匹配中缺少行

匹配两个文件之间的两个字段 AWK

如何解释和优化awk数组以匹配和修改两个文件的公共列

awk grep 或 sed:如何匹配两个文件

awk 混淆了两个包含数字的不同字符串