2017-04-18 320 views
1

我想按以下方式将两个csv文件合并成一个文件。 第一个文件:包含所有数据。 第二个文件:包含数据更新。在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脚本。

在此先感谢。 :)

+0

你缺少新行吗? – kabanus

+0

缺少换行符?如果需要,我可以添加它在预处理文件 –

+0

NM,有人编辑你的问题。请注意他们做了什么 - 这应该是这样。也是任何语言OK或只是bash/csh? – kabanus

回答

0

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

解析。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 
+0

感谢Thor @ that works(Y):) –

0

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

如果你的文件1拥有此行

3,再见,789

和文件2有这些行

3,你好,789

4 ,Bye,345

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

然后指定

没有旧条目应该被删除

但结果文件不包括线

3,再见,789

很显然你期望数据被删除。

一旦你更好地定义了你的标准,那么你就可以开始编程一个解决方案。

+0

第一个数字是我的钥匙。 如果密钥存在于第二个文件中,则应更新旧条目。 这些文件,结果应该是这样的: 3,你好,789 4,再见,345 (3既文件中,第二文件数据应该存在于最终的结果在这种情况下) –

+0

这ISN”答案是,你应该将其转移到我认为的评论中。 – kabanus

0

一个bash溶液假设变量为res不存在:

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 
+0

评论 - 如果重要的话,整个事情可以写在一行,如果你需要它在一个shell。 – kabanus