在linux中合​​并两个csv文件

时间:2017-04-18 18:12:33

标签: linux csv text-processing

我正在尝试以下列方式将两个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脚本寻找一些更简单的解决方案。

先谢谢。 :)

3 个答案:

答案 0 :(得分:0)

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

如果您的文件1有此行

  

3,再见,789

和文件2有这些行

  

3,你好,789

     

4,再见,345

然后你需要指定什么是“更新”。第一个数字是您的数据密钥吗?这个词是关键吗?案件有意义吗?最后一个号码是你的钥匙吗?

然后指定

  

不应删除旧条目

但您的结果文件不包含

  

3,再见,789

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

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

答案 1 :(得分:0)

假设文件中的第一个元素是密钥,您可以使用awk这样做:

parse.awk

BEGIN { FS = OFS = "," }

FNR == NR { 
  h[$1] = $0
  next
} 

{ h[$1] = $0 }

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

像这样运行:

awk -f parse.awk file1 file2

或者作为一个单行:

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

两种情况下的输出:

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

答案 2 :(得分:0)

假设变量res不存在的bash解决方案:

for f in file1 file2; do
    while read line; do
       res[${line%%,*}]=$line; 
    done < $f
done

现在,数组包含您想要的内容。如果你现在想要它在文件中:

for x in ${res[*]}; do echo $x; done > resultFile