我有两个文件:
old.csv
id,a,b
X0,0,0
X1,1,1
X2,2,2
new.csv
id,a,b
X0,0,1
X2,2,2
X3,3,3
X4,4,4
X5,5,5
X6,6,6
X7,7,7
其中id
是每个文件中的唯一标识符。
我的目标是双重的:1)找到old.csv
中已更改的任何行,并附加任何" new"来自new.csv
的行; 2)将1)的结果附加到现有的old.csv
文件中,同时仅保留每个唯一id
值的最新(文件的最后/更低)。
我已经完成了1):
$ diff -u old.csv new.csv | grep '^+[^+]' | sed 's/^+//' > results.csv
$ cat results.csv
X0,0,1
X3,3,3
X4,4,4
X5,5,5
X6,6,6
X7,7,7
这很棒 - 它给了我X0(已经改变),遗漏了X1和X2(没有改变),并附加了" new"线。
我也完成了2)的一部分:
$ cat results.csv >> old.csv
$ cat old.csv
id,a,b
X0,0,0
X1,1,1
X2,2,2
X0,0,1
X3,3,3
X4,4,4
X5,5,5
X6,6,6
X7,7,7
但是X0的第一个实例仍然存在......我只想保留最新的实例,所以old.csv
文件中的第5行。我想要的结果如下:
id,a,b
X1,1,1
X2,2,2
X0,0,1
X3,3,3
X4,4,4
X5,5,5
X6,6,6
X7,7,7
答案 0 :(得分:1)
试试这个:
awk -F, '
NR == 1 {print}
FNR == 1 {next}
{data[$1] = $0}
END {for (id in data) print data[id]}
' old.csv new.csv
要保存回old.csv,请执行以下操作之一:
awk ... old.csv new.csv > old.csv.new && mv old.csv.new old.csv
或使用moreutils包中的sponge
awk ... old.csv new.csv | sponge old.csv