![根据匹配的第一列(带标题)合并两个 CSV](https://linux22.com/image/181444/%E6%A0%B9%E6%8D%AE%E5%8C%B9%E9%85%8D%E7%9A%84%E7%AC%AC%E4%B8%80%E5%88%97%EF%BC%88%E5%B8%A6%E6%A0%87%E9%A2%98%EF%BC%89%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%20CSV.png)
我有两个 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-工具