我正在尝试以下列方式将两个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 :(得分: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