Bash 加入 csv 文件

Bash join csv files

我有三个 .csv 文件:

File1.csv

Header1
data1;data2;data3

File2.csv

Header2
data1;data2;data3
data1;data2;data3

File3.csv

Header3
data1;data2;data3

我想这样加入他们:

Header1;     ;     ;Header2;     ;     ;Header3;     ;
data1  ;data2;data3;data1  ;data2;data3;data1  ;data2;data3
       ;     ;     ;data1  ;data2;data3;       ;     ;

我一直在尝试用 paste 加入文件,但是列总是混淆。我认为发生这种情况是因为有时其中一个文件没有数据(只有 header)或 File2.csv 的数据多于 File1.csv。在这种情况下,它应该如下所示:

Header1;     ;     ;Header2;     ;     ;Header3;     ;
       ;     ;     ;data1  ;data2;data3;data1  ;data2;data3
       ;     ;     ;data1  ;data2;data3;       ;     ;

paste 是完成此任务的最佳方法吗?

ps。我可以更改 .csv 文件的创建方式。我现在使用分号作为分隔符,但如果这样更容易,可以更改。

Python 解法:

merge_csv.py 脚本:

import sys
with open(sys.argv[1], 'r') as f1, open(sys.argv[2], 'r') as f2, open(sys.argv[3], 'r') as f3:

    f1_lines, f2_lines, f3_lines = f1.read().splitlines(), f2.read().splitlines(), f3.read().splitlines()
    max_lines = max(len(i) for i in (f1_lines, f2_lines, f3_lines))
    fmt = '{:7s};' * 8 + '{:7s}'

    for i in range(max_lines):
        if i == 0:
            print(fmt.format(f1_lines[i],'','',f2_lines[i],'','',f3_lines[i],'',''))
        else:
            f1_args = f1_lines[i].split(';') if i < len(f1_lines) else ['', '', '']
            f2_args = f2_lines[i].split(';') if i < len(f2_lines) else ['', '', '']
            f3_args = f3_lines[i].split(';') if i < len(f3_lines) else ['', '', '']
            print(fmt.format(*(f1_args + f2_args + f3_args)))

用法:

python merge_csv.py File1.csv File2.csv File3.csv

输出:

Header1;       ;       ;Header2;       ;       ;Header3;       ;       
data1  ;data2  ;data3  ;data1  ;data2  ;data3  ;data1  ;data2  ;data3  
       ;       ;       ;data1  ;data2  ;data3  ;       ;       ;