在考虑重复之后保留最新/最近的行

时间:2018-02-08 14:39:19

标签: linux file unix command-line

我有两个文件:

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

1 个答案:

答案 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