用于组合单独的 csv 文件的脚本

用于组合单独的 csv 文件的脚本

我有两个单独的文件,其中包含有关客户的信息,我想将其合并为一个。第一个文件包含全局信息,第二个文件用于选项。

基本上,每个客户端在第一个文件中都有一个条目,而只有某些客户端在第二个文件中拥有一个条目。

我的目标是将第二个文件合并到第一个(完整)文件中,(如果可能)没有重复的列。我尝试过粘贴和猫,但没有成功......

例子 :

完整.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将输出重新格式化为对齐良好的表格。如果没有这个,列将呈锯齿状,因为它们都将由一个空格分隔。

答案2

csv连接会做你想做的事左外连接,如果您首先在每个文件中连接 NAME 和 SURNAME,以便可以将其用作键,或者如果您使用 -c 选项并将这些字段组合起来用作键。

相关内容