我有两个单独的文件,其中包含有关客户的信息,我想将其合并为一个。第一个文件包含全局信息,第二个文件用于选项。
基本上,每个客户端在第一个文件中都有一个条目,而只有某些客户端在第二个文件中拥有一个条目。
我的目标是将第二个文件合并到第一个(完整)文件中,(如果可能)没有重复的列。我尝试过粘贴和猫,但没有成功......
例子 :
完整.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
你能给我指个方向吗?
干杯
答案1
您可以通过join
结合其他工具来实现此目的,这些工具都是 coreutils 的一部分,因此每个 Linux 机器上都存在。 BSD 也有这些工具,但它们没有我在这里使用的标志。
join
使用其中一列作为钥匙用于比较两个文件中的行。要使用多个列作为键,您必须删除其中的空格,例如用制表符替换它们。您没有指定这是否是您想要的,所以我假设我们正在加入“Name”。如果您需要合并列,请提出单独的问题。
最后一个先决条件:两个文件都需要在键列上排序。您的示例数据似乎已按“名称”排序,但让我们确保:
$ sort --key=2 complete.csv > sorted-complete.csv
$ sort --key=2 options.csv > sorted-options.csv
现在我们准备将文件粘贴在一起:
$ join -a 1 -j 2 -o '1.1 1.2 1.3 1.4 1.5 2.4 2.5' \
--header sorted-complete.csv sorted-options.csv \
| column -t
Number Name Surname Price Town Op_Price Option
2 Alpha Beta 10.0 Blob 65.0 Yawn
1 Gamma Delta 13.0 Upsy
让我们来解构它。
反斜杠 ( \
) 用于换行,以提高可读性。您可以删除它们。
-a 1
意思是“打印所有行第一的文件`(即sorted-complete.csv)。
-j 2
意思是“关键列是第二一”。
-o ...
设置输出格式。它包含格式为 的说明符<file number>.<column number
。例如,“1.1”表示“sorted-complete.csv”的第一列,而2.5表示“sorted-options.csv”的第五列。如果不指定输出格式,则将首先打印关键列,并在“完整”数据之后重复打印。
最后,column -t
将输出重新格式化为对齐良好的表格。如果没有这个,列将呈锯齿状,因为它们都将由一个空格分隔。