Linux 在计算重复项后保留最新/最近的行
我有两个文件: old.csvLinux 在计算重复项后保留最新/最近的行,linux,file,unix,command-line,Linux,File,Unix,Command Line,我有两个文件: old.csv id,a,b X0,0,0 X1,1,1 X2,2,2 id,a,b X0,0,1 X2,2,2 X3,3,3 X4,4,4 X5,5,5 X6,6,6 X7,7,7 new.csv id,a,b X0,0,0 X1,1,1 X2,2,2 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.c
id,a,b
X0,0,0
X1,1,1
X2,2,2
id,a,b
X0,0,1
X2,2,2
X3,3,3
X4,4,4
X5,5,5
X6,6,6
X7,7,7
new.csv
id,a,b
X0,0,0
X1,1,1
X2,2,2
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
中的任何“新”行;2) 将1)中的结果附加到现有的old.csv
文件,同时仅保留每个唯一id
值的最新(文件中的最后一个/较低)出现
我已经完成了1):
这是伟大的-它给了我X0(已更改),省略了X1和X2(未更改),并附加了“新”行
我还完成了第2部分):
但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
或从moreutils软件包中使用
awk ... old.csv new.csv | sponge old.csv