【问题标题】:Join multiple tables by row names [duplicate]按行名连接多个表[重复]
【发布时间】:2018-03-22 10:04:40
【问题描述】:

我想按行名合并多个表。这些表的行数不同,并且它们具有唯一和共享的行,它们都应该出现在输出中。如果可能的话,我想用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 不在输出中。

【问题讨论】:

    标签: bash shell join awk


    【解决方案1】:

    你想做一个完整的外连接:

    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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 非常感谢您的回答!可以很好地解决给定的问题! awk 仍然适用于以这种方式合并超过 2 个表吗?修改单行以添加从 n 个(例如 20 个)表派生的附加列的最佳方法是什么?
      • @user2715173 gawk 有 ARGIND 变量,它对处理多输入文件很有用,尤其是 >3 的情况。我建议使用“数组数组”来处理 n 个表的情况。你可以在这里找到一些细节:gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html
      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 2018-12-12
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2015-03-22
      相关资源
      最近更新 更多