合并 linux 中的两个 csv 文件

merge two csv file in linux

我正在尝试通过以下方式将两个 csv 文件合并为一个文件。 第一个文件:包含所有数据。 第二个文件:包含更新的数据。

所以结果文件应该包含所有数据,行通过第二个文件数据修改..

示例:

file1:
1,Hello,123
2,Hello,456
3,Bye,789

file2:
1,Hello,123
3,Hello,789
4,Bye,345

resulted file:
1,Hello,123
2,Hello,456
3,Hello,789
4,Bye,345

应添加所有新条目,不应删除旧条目,应在结果中更新任何更新的条目。

我正在通过一些 shell 脚本寻找更简单的解决方案。

提前致谢。 :)

您需要更好地定义术语“数据已更新”。

如果你的文件1有这一行

3,Bye,789

文件 2 有这些行

3,Hello,789

4,Bye,345

那么您需要指定什么是“已更新”。第一个数字是您的数据密钥吗?这个词是关键吗?案件重大吗?最后一个数字是你的钥匙吗?

然后你指定

no old entry should be removed

但您的结果文件不包含行

3,Bye,789

很明显,您希望删除数据。

一旦您更好地定义了标准,就可以开始编写解决方案了。

假设文件中的第一个元素是键,你可以用 awk 这样做:

parse.awk

BEGIN { FS = OFS = "," }

FNR == NR { 
  h[] = [=10=]
  next
} 

{ h[] = [=10=] }

END { 
  for(k in h)
    print h[k]
}

运行 像这样:

awk -f parse.awk file1 file2

或单线:

awk 'FNR==NR{h[]=[=12=];next} {h[]=[=12=]}END{for(k in h)print h[k]}' FS=, OFS=, file1 file2

两种情况下的输出:

1,Hello,123
2,Hello,456
3,Hello,789
4,Bye,345