Join 如何基于第二列连接两个文件,而不更改第一个文件的非列顺序?

Join 如何基于第二列连接两个文件,而不更改第一个文件的非列顺序?,join,awk,merge,Join,Awk,Merge,例如,这里有两个数据文件: 文件1: target 1 6791340 10.9213 2 6934561 9.6791 3 6766224 9.5835 4 6753444 9.1097 5 6809077 8.7386 6 6818752 8.7172 fil2: 文件3(输出): 如您所见,目标列的顺序与file1完全相同。但是,基于目标列,file2遵循file1的顺序,并且file2中的列也相应地发

例如,这里有两个数据文件:

文件1:

        target
     1 6791340 10.9213
     2  6934561 9.6791
     3  6766224 9.5835
     4  6753444 9.1097
     5  6809077 8.7386
     6  6818752 8.7172
fil2:

文件3(输出):

如您所见,目标列的顺序与file1完全相同。但是,基于目标列,file2遵循file1的顺序,并且file2中的列也相应地发生了更改。真正的文件很大,“目标”只是为了澄清而写的。有导游吗

这就是我所尝试的:

awk 'NR==FNR{ a[$2]=$1; next }{ print a[$1],$1,$2 }' file1 file2 > 
output

但是这会改变目标列的顺序。

最简单的方法是不对第二列上的两个文件排序,然后在第1列上再次排序?请注意,您在这里不使用缓冲区并调用各种程序。一个干净的
awk
解决方案由给出


切换文件处理的顺序

$ awk 'NR==FNR{a[$2]=$1 OFS $3; next} ($2 in a){print $0, a[$2]}' f2 f1
1 6791340 10.9213 5 9.1914
2 6934561 9.6791 6 9.1914
3 6766224 9.5835 1 11.7845
4 6753444 9.1097 2 9.6863
5 6809077 8.7386 3 9.5252
6 6818752 8.7172 4 9.3867
  • (a中的$2)
    如果第二列肯定匹配,则可以删除

@zara请注意,此解决方案(以及Sundeep的解决方案)仅在第2列具有唯一编号时有效。
awk 'NR==FNR{ a[$2]=$1; next }{ print a[$1],$1,$2 }' file1 file2 > 
output
 % join -j2 <(sort -g -k2 file1) <(sort -g -k2 file2) \
        -o 1.1,1.2,1.3,2.1,2.3 | sort -g -k1   
1 6791340 10.9213 5 9.1914
2 6934561 9.6791 6 9.1914
3 6766224 9.5835 1 11.7845
4 6753444 9.1097 2 9.6863
5 6809077 8.7386 3 9.5252
6 6818752 8.7172 4 9.3867
join -j2 <(sort -g -k2 file1) <(sort -g -k2 file2) | awk '{t=$2;$2=$1;$1=t}1' | sort -g -k1 
$ awk 'NR==FNR{a[$2]=$1 OFS $3; next} ($2 in a){print $0, a[$2]}' f2 f1
1 6791340 10.9213 5 9.1914
2 6934561 9.6791 6 9.1914
3 6766224 9.5835 1 11.7845
4 6753444 9.1097 2 9.6863
5 6809077 8.7386 3 9.5252
6 6818752 8.7172 4 9.3867