例如,这里有两个数据文件:
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
但是这会改变目标列的顺序。
答案 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.3
是join
的输出选项,它指示打印文件1的第1列(1.1
),然后是文件1的第2列({{1} })等等。
时服从
1.2
:man join
在构造输出线-o FORMAT
FORMAT
是一个或多个逗号或空白分隔的规范 是FORMAT
或FILENUM.FIELD
。默认0
输出连接字段,其余字段来自FILE1,其余字段来自 FILE2,全部由CHAR分隔。如果FORMAT
是关键字FORMAT
,那么 每个文件的第一行 确定每行输出的字段数。
如果没有此选项,您仍然需要交换第1列和第2列。
auto