使用awk根据文件的两列限制标志

时间:2013-10-03 18:41:20

标签: awk

我有一个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相同,只让reprice标志值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

对于发布错误感到抱歉。

1 个答案:

答案 0 :(得分: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"; }计算Reprice列的值

v == "1" {reprice[$2] = 1}标志着我们已经看到了重新定价(只有在重定价发生时触发,即v == "1"时)

当您已经看到给定ID的重定价时,

v == "1" && reprice[$2] { v = "0"; }会将重新定价设置为"0"

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