加入/合并不共享所有标题/列的 CSV 文件

Ste*_*iny 1 bash awk csv

我有一个包含来自数据记录系统的 1000 个文件的目录,每个文件可以有多达 40,000 行或更多行。挑战在于,有时数据并未从一个或多个传感器记录下来,因此会丢失,例如

文件1:

A,B,C,D,F

10,20,10,20,5
Run Code Online (Sandbox Code Playgroud)

文件2:

B,C,D,E,F

20,10,20,5,10
Run Code Online (Sandbox Code Playgroud)

文件3:

D,E,F


10,30,20
Run Code Online (Sandbox Code Playgroud)

所需的结果将所有文件合并/加入单个标题。如果输入文件缺少一列(因为传感器损坏),该部分将替换为空值

A,B,C,D,E,F

10,20,10,20,,5

,20,10,20,5,10

,,,10,30,20
Run Code Online (Sandbox Code Playgroud)

最后一列 F 始终存在,因为那是日期/时间戳。

我找到了这个答案,但是它假设所有文件的所有标题/列都相同

粘贴多个具有不同标题顺序的大型 csv 文件

我还发现了这个问题Merging multiple CSV files for matching and non matching columns但答案不够完整,我无法使用它。

谢谢

abo*_*uso 7

如果您想尝试替代且非常干净且简单的工具(https://github.com/johnkerl/miller),请从您输入 CSV 文件的文件夹开始,使用此命令

mlr --csv unsparsify *.csv >out.csv
Run Code Online (Sandbox Code Playgroud)

你将会有

A,B,C,D,F,E
10,20,10,20,5,
,20,10,20,10,5
,,,10,20,30
Run Code Online (Sandbox Code Playgroud)

如果你想让 F a 结束,命令是

mlr --csv unsparsify then reorder -e -f F *.csv
Run Code Online (Sandbox Code Playgroud)

如果你有很多文件,你可以分两步完成:

mlr --icsv cat *.csv >tmp.txt
mlr --ocsv unsparsify tmp.txt >out.csv
Run Code Online (Sandbox Code Playgroud)