我有一个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
对于发布错误感到抱歉。
答案 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"
时)
v == "1" && reprice[$2] { v = "0"; }
会将重新定价设置为"0"
。
{ print $0, v; a = $2; b = $3 }
打印数据