按行名称连接多个表

时间:2013-08-25 09:56:39

标签: bash shell join awk

我想按行名称合并多个表。这些表的行数不同,它们具有唯一和共享的行,这些行应该全部出现在输出中。如果可能,我想用awk解决问题,但我对其他解决方案也很好。

table1.tab

a 5
b 5
d 9

table2.tab

a 1
b 2
c 8
e 11

输出我想获得下表:

table3.tab

a 5 1
b 5 2
d 9 0
c 0 8
e 0 11

我尝试使用join

join table1.tab table2.tab > table3.tab

但我得到

table3.tab

a 5 1
b 5 2

cde不在输出中。

2 个答案:

答案 0 :(得分:4)

您想要进行完全外部联接:

join -a1 -a2 -o 0 1.2 2.2 -e "0" table1.tab table2.tab

a 5 1
b 5 2
c 0 8
d 9 0
e 0 11

答案 1 :(得分:2)

这个awk oneliner应该适用于你的例子:

awk 'NR==FNR{a[$1]=$2;k[$1];next}{b[$1]=$2;k[$1]}
END{for(x in k)printf"%s %d %d\n",x,a[x],b[x]}' table1 table2

测试

kent$  head f1 f2
==> f1 <==
a 5
b 5
d 9

==> f2 <==
a 1
b 2
c 8
e 11

kent$  awk 'NR==FNR{a[$1]=$2;k[$1];next}{b[$1]=$2;k[$1]}END{for(x in k)printf"%s %d %d\n",x,a[x],b[x]}'  f1 f2
a 5 1
b 5 2
c 0 8
d 9 0
e 0 11