如何根据第二列连接两个文件而不更改第一个文件的非列的顺序?

时间:2018-03-15 10:14:27

标签: join awk merge

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

file1:

        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:

1 6766224 11.7845
2 6753444 9.6863
3 6809077 9.5252
4 6818752 9.3867
5 6791340 9.1914
6 6934561 9.1914

file3的(输出):

     target
 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

如您所见,目标列的顺序与file1完全相同。但是,file2遵循基于目标列的file1的顺序,并且file2中的列也相应地更改。真正的文件很大,而且#34; target"是为了澄清而写的。请问任何指南?

这就是我的尝试:

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

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

2 个答案:

答案 0 :(得分:2)

切换文件处理的顺序

$ 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
    如果第二列肯定匹配,则可以删除
  • ($2 in a)

答案 1 :(得分:1)

最简单的方法是不对第二列上的两个文件进行排序,然后再对第1列进行排序吗?请注意,您在此处缓冲并调用各种程序。干净的awk解决方案由Sundeep提供。

 % 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

标志-o 1.1,1.2,1.3,2.1,2.3join的输出选项,它指示打印文件1的第1列(1.1),然后是文件1的第2列({{1} })等等。

  

1.2 :   man join                 在构造输出线

时服从-o FORMAT      

FORMAT是一个或多个逗号或空白分隔的规范          是FORMATFILENUM.FIELD。默认0输出连接字段,其余字段来自FILE1,其余字段来自   FILE2,全部由CHAR分隔。如果FORMAT是关键字FORMAT,那么   每个文件的第一行          确定每行输出的字段数。

如果没有此选项,您仍然需要交换第1列和第2列。

auto