在 unix 中连接表

Join tables in unix

我有 3 个 table:

table 1

 a  1
 b  2
 c  3

table 2

 a  2
 b  2
 c  6

table 3

 a  9
 b  0
 c  1

我想加入他们,但要添加一个独特的列,如下所示:

 table1   a  1
 table1   b  2
 table1   c  3
 table2   a  2
 table2   b  2
 table2   c  6
 table3   a  9
 table3   b  0
 table3   c  1

使用 cat 我可以加入 tables,但是我如何区分它们之间的数据?我想添加一列来显示这一点。我是否需要通过添加具有特定名称的列来处理初始 tables,然后加入 tables?如果是这样,我如何添加一个列,其所有行都具有相同的名称?

您可以使用 awk 并将文件名用作第一列:

awk '{ print FILENAME, [=10=] }' table* > merged_table

编辑:

要删除文件名后缀,您可以将 FILENAME 分配给变量并将后缀替换为空字符串:

awk '{ fname=FILENAME; sub(/\..+$/, "", fname); print fname, [=11=] }' table* > merged_table

要只执行一次而不是每一行都执行此操作,您可以在启动时将名称保存在数组中并引用它们。 这只对巨大的输入文件有意义:

awk '
  BEGIN{
    for (i=1;i<ARGC;i++){
      fname=ARGV[i]
      sub(/\..+$/, "", fname)
      names[ARGV[i]]=fname
    }
  }
  { print names[FILENAME], [=12=] }
' table* > merged_table