【发布时间】:2016-09-02 10:54:53
【问题描述】:
我正在寻找一个 UNIX shell 解决方案来在两个文本文件之间执行相当于 SQL MERGE(或 UPSERT)的操作,其中一些字段是关键字段,而其他字段可以更新/覆盖。
输入数据
这是我的原始数据:
AA;123;2016-01-31;1;456.53
AA;123;2016-02-01;1;75.24
AB;123;2000-08-08;1;756.1
AB;456;2016-07-07;2;8.24
CC;123;2007-07-21;15;10.34
CC;456;2009-09-09;9;943.65
CC;789;2005-04-23;1;1345.6
其中前三个字段(Product、Customer 和 Date)是关键字段,后两个字段(Quantity 和 Amount) 可以更新。
这是我的第二个文件,它只包含新的和更新的数据:
AA;123;2016-01-31;7;983.63
AA;123;2016-08-24;17;1687.73
CC;456;2009-09-09;11;2161.65
DD;91;2016-08-03;5;98.48
这两个文件都已排序:
sort -t';' -k1 -k2 -k3
第一条和第三条记录应该覆盖现有的行(更新Quantity和Amount),而第二条和第三条记录应该作为新行插入。
期望的输出
AA;123;2016-01-31;7;983.63
AA;123;2016-08-24;17;1687.73
AA;123;2016-02-01;1;75.24
AB;123;2000-08-08;1;756.1
AB;456;2016-07-07;2;8.24
CC;123;2007-07-21;15;10.34
CC;456;2009-09-09;11;2161.65
CC;789;2005-04-23;1;1345.6
DD;91;2016-08-03;5;98.48
我正在寻找使用sort、uniq 或awk 和perl 的快速解决方案。
【问题讨论】:
-
然后我在发布这个问题两分钟后找到了
awk '!a[$0]++'。