我需要编写一个 shell 脚本来合并 csv 文件。这两个文件都有相同的列,其中固定数量的列被指定为“Keys”。如果键相同,那么我想通过添加非键列来合并它们。
例如:
A.csv
k1,k2,k3,v1,v2 => This is the header row
A,B,C,4,5
A,B,D,3,4
B.csv
k1,k2,k3,v1,v2 => This is the header row
A,B,A,2,3
A,B,C,1,4
A,B,E,4,5
Merged.csv
:
k1,k2,k3,v1,v2 => This is the header row
A,B,A,2,3
A,B,C,5,9 => A,B,C is present in both the csv, so value cols are added
A,B,D,3,4
A,B,E,4,5
答案1
使用米勒(http://johnkerl.org/miller/doc/index.html) 和
mlr --csv stats1 -a sum -g k1,k2,k3 -f v1,v2 input_a.csv input_b.csv
你将会拥有
k1,k2,k3,v1_sum,v2_sum
A,B,C,5,9
A,B,D,3,4
A,B,A,2,3
A,B,E,4,5
答案2
awk:
BEGIN{FS=OFS=","}
# print head row
NR==1;
# skip blank, sum column 4, 5 into a, b
FNR!=1 && NF!=0 {k=($1","$2","$3); a[k]+=$4; b[k]+=$5 }
# print result
END { for(k in a) print k, a[k], b[k] }