使用 join/awk/sed 合并 CSV 文件

2024-04-15

您能帮我找到 bash 命令,该命令会将以下 cvs 文件“template.csv + file1.csv + file2.csv + file3.csv + ... + fileX.csv”加入/合并到“ouput.csv”中吗? 。

对于 template.csv 中的每一行,连接 fileX.csv 中列出的关联值(如果存在),如下所示:

模板.csv:

header
1
2
3
4
5
6
7
8
9

文件1.csv:

header,value1
2,value12
3,value13
7,value17
8,value18
9,value19

文件2.csv:

header,value2
1,value21
2,value22
3,value23
4,value24

文件3.csv:

header,value3
2,value32
4,value34
6,value36
7,value37
8,value38

输出.csv:

header,value1,value2,value3
1,,value21,
2,value12,value22,value32
3,value13,value23,
4,,value24,value34
5,,,
6,,,value36
7,value17,,value37
8,value18,,value38
9,value19,,

我的模板文件包含 35137 行。
我已经开发了一个 bash 脚本来执行此合并(基于“do while”等),但性能一点也不好。太长,无法生成output.csv。我确信可以使用 join、awk 来执行相同的操作,...但我不知道如何...

重要更新

我的真实文件的第一列包含日期时间而不是简单的数字...因此脚本必须考虑日期和时间之间的空格...抱歉更新!

现在应使用以下 csv 文件作为示例来设计脚本:

模板.csv:

header
2000-01-01 00:00:00
2000-01-01 00:15:00
2000-01-01 00:30:00
2000-01-01 00:45:00
2000-01-01 01:00:00
2000-01-01 01:15:00
2000-01-01 01:30:00
2000-01-01 01:45:00
2000-01-01 02:00:00

文件1.csv:

header,value1
2000-01-01 00:15:00,value12
2000-01-01 00:30:00,value13
2000-01-01 01:30:00,value17
2000-01-01 01:45:00,value18
2000-01-01 02:00:00,value19

文件2.csv:

header,value2
2000-01-01 00:00:00,value21
2000-01-01 00:15:00,value22
2000-01-01 00:30:00,value23
2000-01-01 00:45:00,value24

文件3.csv:

header,value3
2000-01-01 00:15:00,value32
2000-01-01 00:45:00,value34
2000-01-01 01:15:00,value36
2000-01-01 01:30:00,value37
2000-01-01 01:45:00,value38

输出.csv:

header,value1,value2,value3
2000-01-01 00:00:00,,value21,
2000-01-01 00:15:00,value12,value22,value32
2000-01-01 00:30:00,value13,value23,
2000-01-01 00:45:00,,value24,value34
2000-01-01 01:00:00,,,
2000-01-01 01:15:00,,,value36
2000-01-01 01:30:00,value17,,value37
2000-01-01 01:45:00,value18,,value38
2000-01-01 02:00:00,value19,,

$ cat tst.awk
BEGIN { FS=OFS="," }
NR == FNR { key[++numRows] = $1 }
{ fld[$1,ARGIND] = $NF }
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=ARGIND; colNr++) {
            printf "%s%s", fld[key[rowNr],colNr], (colNr<ARGIND ? OFS : ORS)
        }
    }
}

$ awk -f tst.awk template.csv file1.csv file2.csv file3.csv
header,value1,value2,value3
2000-01-01 00:00:00,,value21,
2000-01-01 00:15:00,value12,value22,value32
2000-01-01 00:30:00,value13,value23,
2000-01-01 00:45:00,,value24,value34
2000-01-01 01:00:00,,,
2000-01-01 01:15:00,,,value36
2000-01-01 01:30:00,value17,,value37
2000-01-01 01:45:00,value18,,value38
2000-01-01 02:00:00,value19,,

上面使用 GNU awk 进行ARGIND,对于其他 awk,只需添加一行:FNR==1 { ++ARGIND }.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 join/awk/sed 合并 CSV 文件 的相关文章

随机推荐