Join 如何基于第二列连接两个文件,而不更改第一个文件的非列顺序?
例如,这里有两个数据文件: 文件1: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中的列也相应地发
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)
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