在 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
我有 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