我有一些数据文件,我想为其生成一个“差异”列,这意味着添加一个列来指示是否已从当前文件中添加/删除了特定行。例如,我有以下两个文件a.csv
:
id,data,data2
1,A,B
2,A,B
3,A,B
4,A,B
和b.csv
:
id,data,data2
2,A,C
3,A,C
4,A,C
5,A,C
我只想根据id
是否添加/删除行进行比较。数据无所谓。到目前为止,我想出的最好的方法是以以下方式使用miller :
#!/bin/bash
t1=$(mktemp)
t2=$(mktemp)
t3=$(mktemp)
mlr --icsv --ocsv put '$diff = "-"' then reorder -f diff a.csv > "$t1"
mlr --icsv --ocsv put '$diff = "+"' then reorder -f diff b.csv > "$t2"
mlr --icsv --ocsv join -f "$t1" -j id --ul --ur --np then unsparsify "$t2" > "$t3"
mlr --icsv --ocsv join -f "$t3" -j id --ul --ur then unsparsify then reorder -f diff,id then sort -nf id b.csv
rm "$t1"
rm "$t2"
rm "$t3"
这会生成以下内容,这就是我想要的:
diff,id,data,data2
-,1,A,B
,2,A,C
,3,A,C
,4,A,C
+,5,A,C
该解决方案的不幸之处在于它需要运行 miller 四次并使用三个临时文件。Miller 似乎不适用于 bash 流程替换(<()
业务)。
有没有更直接的方式来产生这种输出?