我有两个单独的文件,其中包含我想合并为一个的客户信息。第一个文件包含全局信息,第二个是选项。
基本上,每个客户端在第一个文件中都有一个条目,而只有一些客户端在第二个文件中有一个条目。
我的目标是将第二个文件合并到第一个(完整的)文件中,(如果可能的话)没有重复的列。我试过粘贴和猫,但没有成功......
例子 :
完整的.csv:
Number Name Surname Price Town
2 Alpha Beta 10.0 Blob
1 Gamma Delta 13.0 Upsy
选项.csv:
Number Name Surname Op_Price Option
1 Alpha Beta 65.0 Yawn
我想得到这样的东西:
结果.csv:
Number Name Surname Price Town Op_Price Option
2 Alpha Beta 10.0 Blob 65.0 Yawn
1 Gamma Delta 13.0 Upsy
你能给我指个方向吗?
干杯
您可以使用并结合其他工具来实现这一点
join
,这些工具都是 coreutils 的一部分,因此存在于每个 Linux 机器上。BSD 也有这些工具,但它们没有我在这里使用的标志。join
使用其中一列作为比较两个文件中的行的键。要将多列用作键,您必须从中删除空格,例如用制表符替换它们。您没有指定这是否是您想要的,所以我假设我们正在加入“名称”。如果您需要合并列,请提出一个单独的问题。最后一个先决条件:两个文件都需要在键列上进行排序。您的示例数据似乎已经按“名称”排序,但让我们确保:
现在我们准备将文件粘贴在一起:
让我们解构它。
为了便于阅读,反斜杠 (
\
) 用于换行。您可以删除它们。-a 1
表示“打印第一个文件中的所有行” (即 sorted-complete.csv)。-j 2
意思是“关键列是第二个”。-o ...
设置输出格式。它包含格式为<file number>.<column number
. 例如,“1.1”表示“sorted-complete.csv”的第一列,而 2.5 表示“sorted-options.csv”的第五列。如果不指定输出格式,键列会先打印出来,在“完整”数据之后重复。最后,
column -t
将输出重新格式化为对齐良好的表格。没有这个,列将是锯齿状的,因为它们都将被一个空格分隔。如果您首先在每个文件中连接 NAME 和 SURNAME 以便您可以将其用作键,或者如果您使用 -c 选项并将这些字段组合为您的键,则csvjoin将使用左外连接执行您想要的操作。