文件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