use*_*173 5 bash shell awk join
我想按行名称合并多个表.这些表的行数不同,它们具有唯一和共享的行,这些行应该全部出现在输出中.如果可能的话我想解决问题awk
,但我对其他解决方案也很好.
table1.tab
a 5
b 5
d 9
Run Code Online (Sandbox Code Playgroud)
table2.tab
a 1
b 2
c 8
e 11
Run Code Online (Sandbox Code Playgroud)
输出我想获得下表:
table3.tab
a 5 1
b 5 2
d 9 0
c 0 8
e 0 11
Run Code Online (Sandbox Code Playgroud)
我试过用 join
join table1.tab table2.tab > table3.tab
Run Code Online (Sandbox Code Playgroud)
但我明白了
table3.tab
a 5 1
b 5 2
Run Code Online (Sandbox Code Playgroud)
行c
,d
而e
不是输出.
你想做一个完整的外连接:
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
Run Code Online (Sandbox Code Playgroud)
这个 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
Run Code Online (Sandbox Code Playgroud)
测试
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
Run Code Online (Sandbox Code Playgroud)