Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在计算重复项后保留最新/最近的行_Linux_File_Unix_Command Line - Fatal编程技术网

Linux 在计算重复项后保留最新/最近的行

Linux 在计算重复项后保留最新/最近的行,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

我有两个文件:

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.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