根据匹配的第一列(带标题)合并两个 CSV

根据匹配的第一列(带标题)合并两个 CSV

我有两个 CSV 文件。其中一项包含大量数据:

主.csv

Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet
20001,20010,500,5
20002,20011,400,4
20003,20012,300,3
20004,20013,200,2
20005,20014,200,1

虽然我的其他 CSV 文件信息较少:

2020 年 10 月.csv

Order No.,Timestamp,ID
20001,2020-10-01 12:00:00,123456
20002,2020-10-02 13:00:00,123457

我的目标是基于 october-2020.csv 创建一个新的 CSV 文件并添加 main.csv 中的信息。共同信息是订单号:

输出.csv

Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet,Order No.,Timestamp,ID
20001,20010,500,5,20001,2020-10-01 12:00:00,123456
20002,20011,400,4,20002,2020-10-02 13:00:00,123457

这怎么能写成脚本呢?我很感激任何帮助。

答案1

在两个文件的join第一个字段 ( ) 上使用作为字段分隔符:Order No.,

join -t, -o1.1,1.2,1.3,1.4,2.1,2.2,2.3 main.csv october-2020.csv > output.csv

$ cat output.csv
Order No.,invoiceNumber,invoiceAmount,invoiceAmountNet,Order No.,Timestamp,ID
20001,20010,500,5,20001,2020-10-01 12:00:00,123456
20002,20011,400,4,20002,2020-10-02 13:00:00,123457

由于这两个文件已经在第一个字段上排序,因此我们不需要手动对它们进行排序。由于您希望Order No.在输出中出现两次,因此使用选项指定字段-o(第一个输入文件的字段 1-4,第二个文件的字段 1-3)。

答案2

csv-sqlite -i main.csv -i october-2020.csv \
   'select i1.invoiceNumber, i1.invoiceAmount, i1.invoiceAmountNet, i2.*
      from input1 i1, input2 i2
     where i1."Order No." = i2."Order No."' | csv-header --remove-types

csv-sqlite 来自csv-nix-工具

相关内容