Awk 基于列的匹配连接两个文件,但有一些错误

Awk 基于列的匹配连接两个文件,但有一些错误,awk,Awk,我有两个文件,都有不同的行数。文件如下所示 file1 0.156667 152.063604 17730.697726 100.256071 211.932169 14827.664042 108.604047 88.095015 12687.034619 11.868409 263.975480 16270.787931 126.014430 19.739961 19800.463965 file2 100.808 211.717 14.55 6002.643

我有两个文件,都有不同的行数。文件如下所示

file1
0.156667 152.063604 17730.697726 
100.256071 211.932169 14827.664042 
108.604047 88.095015 12687.034619 
11.868409 263.975480 16270.787931 
126.014430 19.739961 19800.463965 

file2
100.808    211.717    14.55     6002.643     16072.78     
109.480     89.050     8.21     6002.197     8962.211     
12.524    263.842    13.07     6001.377     11975.58     
126.885     20.086    10.30     6002.365     16113.52     
我想要的输入是

0.156667 152.063604 17730.697726 NA NA NA
100.256071 211.932169 14827.664042 14.55     6002.643     16072.78 
108.604047 88.095015 12687.034619 8.21     6002.197     8962.211
11.868409 263.975480 16270.787931 13.07     6001.377     11975.58  
126.014430 19.739961 19800.463965 10.30     6002.365     16113.52 
因此,我希望在+-2的误差范围内匹配前两列。基于此,如果匹配为正,我需要将第二个文件中的$3、4和$5列附加到第一个文件中(或者创建一个新文件)。如果没有匹配的,我应该得到NA


谢谢

这里有一种使用awk的方法:

awk '
NR==FNR {
    a[$1,$2]=$3 FS $4 FS $5; 
    next
}
{
    for(x in a) {
        split(x,t,SUBSEP);  
        if(t[1]-2<=$1 && $1<=t[1]+2 && t[2]-2<=$2 && $2<=t[2]+2) {
            print $0, a[x]
            next
        }
    }
    print $0, "NA NA NA"
}' file2 file1
0.156667 152.063604 17730.697726 NA NA NA
100.256071 211.932169 14827.664042 14.55 6002.643 16072.78
108.604047 88.095015 12687.034619 8.21 6002.197 8962.211
11.868409 263.975480 16270.787931 13.07 6001.377 11975.58
126.014430 19.739961 19800.463965 10.30 6002.365 16113.52
awk'
NR==FNR{
a[$1,$2]=$3 FS$4 FS$5;
下一个
}
{
对于(a中的x){
拆分(x、t、子平台);

if(t[1]-2你为什么要使用
int()
?@glennjackman,因为小数。我想在比较之前先把它们去掉,但我认为你是对的。它们似乎提供的不多。你似乎在添加一个没有要求的要求。@glennjackman你是对的。更新了答案,删除了多余的
int()
用法。