合并多个 CSV 文件以获取匹配和不匹配的列

合并多个 CSV 文件以获取匹配和不匹配的列

文件1

abram,john,steve,mark,daniel,stokes
19,567,44,0,77,9

文件2

john,mark,skates
999,1,1

文件3

abram,stokes
55,66

文件4

abram,daniel,john,mark,skates,steve,stokes,yasmin
0,0,0,0,0,0,0,0

我需要的输出是 -

合并.csv

        abram  daniel  john  mark  skates  steve  stokes  yasmin
File1     19     77      567    0     0       44      9        0

File2      0      0      999    1     1        0      0        0

File3     55      0        0    0     0        0     66        0

File4      0      0        0    0     0        0      0        0

答案1

使用米勒(https://github.com/johnkerl/miller),从仅包含您的输入 CSV 文件的文件夹开始,使用

mlr --c2p put '$filename=FILENAME' then unsparsify --fill-with "0" then reorder -f filename *

你会得到

filename abram john steve mark daniel stokes skates yasmin
File1    19    567  44    0    77     9      0      0
File2    0     999  0     1    0      0      1      0
File3    55    0    0     0    0      66     0      0
File4    0     0    0     0    0      0      0      0

要获得 CSV 输出而不是打印精美的表格,请将选项更改--c2p--csv

答案2

它很丑陋,但如果您可以将文件转置为合适的柱状形式,并将它们的文件名放在一列中,那么您可以在 GNU datamash 中对它们进行交叉制表:

for f in File{1..4}; do rs -c, -T < "$f" | awk -vf="$f" '{print f, $0}'; done | 
  datamash -Ws --filler='0' crosstab 1,2 unique 3
       abram  daniel  john  mark  skates  steve  stokes  yasmin
File1  19      77    567   0       0      44      9       0
File2  0       0     999   1       1      0       0       0
File3  55      0     0     0       0      0       66      0
File4  0       0     0     0       0      0       0       0

相关内容