1

我有一个 awk 命令,它根据第 2 列比较第 3 列。如果第 2 列(ID)相等,它会比较第 3 列(优惠券)以查看值是否不同并将它们标记为 0 或 1。

awk 'BEGIN{OFS=" ";} NR==1 { print; next } { print $0, ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; a = $2; b = $3 }' testv1.txt

样本输入。

Month    ID Coupon  Reprice
2013-12  2  4.00    
2014-01  2  4.00    
2014-02  2  4.50    
2014-03  2  4.50    
2013-10  3  3.00    
2013-11  3  3.00    
2013-12  3  3.25    
2014-01  3  3.25    
2014-02  3  3.25    
2014-03  3  3.50

这是当前的输出。

Month    ID Coupon  Reprice
2013-12  2  4.00    0
2014-01  2  4.00    0
2014-02  2  4.50    1
2014-03  2  4.50    0
2013-10  3  3.00    0
2013-11  3  3.00    0
2013-12  3  3.25    1
2014-01  3  3.25    0
2014-02  3  3.25    0
2014-03  3  3.50    1

我想要的是,如果 ID 相同,只让重新定价标志值 1 出现一次,就像这样(最后一个重新定价标志将是 0 而不是 1)。

Month    ID Coupon  Reprice
2013-12  2  4.00    0
2014-01  2  4.00    0
2014-02  2  4.50    1
2014-03  2  4.50    0
2013-10  3  3.00    0
2013-11  3  3.00    0
2013-12  3  3.25    1
2014-01  3  3.25    0
2014-02  3  3.25    0
2014-03  3  3.50    0

很抱歉发布错误。

4

1 回答 1

2

使用关联数组(另外,下次提供示例输入):

awk 'BEGIN{OFS=" ";} NR==1 { print; next } { v = ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; } v == "1" && reprice[$2] { v = "0"; } { print $0, v; a = $2; b = $3 } v == "1" {reprice[$2] = 1}' testv1.txt

解释:

{ v = ($2 == a) ? (($3 == b) ? "0" : "1") : "0"; }计算重新定价列的值

v == "1" {reprice[$2] = 1}标记我们已经看到重新定价(仅在重新定价发生时触发,即何时v == "1"

v == "1" && reprice[$2] { v = "0"; }将 reprice 设置为"0"当您已经看到给定 id 的 reprice 时。

{ print $0, v; a = $2; b = $3 }打印数据

于 2013-10-03T18:48:10.853 回答