awk +仅当列8大于X + anomoly时才添加具有值的列

时间:2016-05-17 01:18:31

标签: awk

这是我的档案:

$ cat -v test4
"Rec Open Date"|"MSISDN"|"IMEI"|"Data Volume (Bytes)"|"Device Manufacturer"|"Device Model"|"Product Description"|"Data_Volume_MB"
"2015-10-06"|"427"|"060"|"137765"|"Samsung Korea"|"Samsung SM-G900I"|"$39 Plan"|"0.131383"
"2015-10-06"|"592"|"620"|"0"|"Apple Inc"|"Apple iPhone 6 (A1586)"|"PREPAY  STD - TRIAL - #16"|"0"
"2015-10-06"|"007"|"290"|"0"|"Apple Inc"|"Apple iPhone 6 (A1586)"|"PREPAY PLUS - $0 -"|"0"
"2015-10-06"|"592"|"050"|"48836832"|"Apple Inc"|"Apple iPhone 5S (A1530)"|"Talk and Text Connect Flexi Plan"|"46.5744"
"2016-04-27"|"498"|"220"|"146610"|"Guangdong Oppo Mobile Telecommunications Corp Ltd"|"OPPO X9076,OPPO R6006,OPPO R6001,OPPO N5116,OPPO X9006"|"$29.95 Carryover Plan (1GB)"|"0.139818"
"2015-10-06"|"409"|"720"|"113755347"|"Samsung Korea"|"Samsung SM-G360G"|"$29 CARRYOVER PLAN"|"108.486"
"2015-10-06"|"742"|"620"|"19840943"|"Apple Inc"|"Apple iPhone S (A1530)"|"PREPAY STD - $0 - #2"|"18.9218"
"2015-10-06"|"387"|"180"|"0"|"HUAWEI Technologies Co Ltd"|"HUAWEI HUAWEI G526-L11"|"PREPAY STD - $1 - #4"|"0"

我想要做的是在末尾添加一个值为1的列,如果列$ 8大于20,则为其赋值为零。我认为我有正确的命令,但由于某种原因,一些数字不符合条件

这是我遇到问题的部分,但它给了我这个动词:
NR>1{n=$8; gsub(/"/,"",n); (n>20?$(NF+1)=1:$(NF+1)=0)}1'
任何人都可以提供建议吗?

例如: 当此条件n>108?列8 =“108.486”时,第9列等于1,另外2个不等于1 46.574418.9218

$ awk -F'|' -v q='"' 'NR==1{$(NF+1)=q">200MB"q} NR>1{n=$8; gsub(/"/,"",n); (n>108?$(NF+1)=1:$(NF+1)=0)}1' OFS='|' test4 | awk -F'|' '{print $8 FS $9}'
"Data_Volume_MB"|">200MB"
"0.131383"|0
"0"|0
"0"|0
"46.5744"|1
"0.139818"|0
"108.486"|1
"18.9218"|1
"0"|0

但是当它的条件n>20?列8 =“108.486”时,第9列等于0,但46.5744等于1

$ awk -F'|' -v q='"' 'NR==1{$(NF+1)=q">200MB"q} NR>1{n=$8; gsub(/"/,"",n); (n>20?$(NF+1)=1:$(NF+1)=0)}1' OFS='|' test4 | awk -F'|' '{print $8 FS $9}'
"Data_Volume_MB"|">200MB"
"0.131383"|0
"0"|0
"0"|0
"46.5744"|1
"0.139818"|0
"108.486"|0
"18.9218"|0
"0"|0
$

1 个答案:

答案 0 :(得分:1)

对于>20案例,请注意一个小的更改可以解决问题:

$ awk -F'|' -v q='"' 'NR==1{$(NF+1)=q">200MB"q} NR>1{n=$8; gsub(/"/,"",n); (n+0>20?$(NF+1)=1:$(NF+1)=0)}1' OFS='|' test4 | awk -F'|' '{print $8 FS $9}'
"Data_Volume_MB"|">200MB"
"0.131383"|0
"0"|0
"0"|0
"46.5744"|1
"0.139818"|0
"108.486"|1
"18.9218"|0
"0"|0

此更改正在将n>20替换为n+0>20。原因是+0强制将n视为数字,而不是字符串,因此进行数字比较。

换句话说,awk能够进行字符串(字母数字)或算术比较。它根据上下文在它们之间进行选择。通过将0添加到n,我们强制它使用算术比较。

简化示例

这显示了$1>20$1+0>20之间的差异:

$ echo '"108.486"' | awk '{gsub(/"/,"",$1); $(NF+1)=($1>20?1:0)} 1' OFS='|'
108.486|0
$ echo '"108.486"' | awk '{gsub(/"/,"",$1); $(NF+1)=($1+0>20?1:0)} 1' OFS='|'
108.486|1