这是我的档案:
$ 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.5744
和18.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
$
答案 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