gpt4 book ai didi

linux - 考虑重复项后保留最新/最近的行

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:41 25 4
gpt4 key购买 nike

我有两个文件:

旧.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.csv 中的任何"new"行; 2) 将 1) 的结果附加到现有的 old.csv 文件,同时仅保留每个唯一 id 的最近(文件中的最后一个/较低的)出现值(value)。

我已经完成了 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

最佳答案

试试这个:

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

或使用 sponge来自 moreutils 包

awk ... old.csv new.csv | sponge old.csv

关于linux - 考虑重复项后保留最新/最近的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48688044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com