我只是想在CSV文件上做一些基本的计算。
数据类型:
31590,Foo,70
28327,Bar,291
25155,Baz,583
24179,Food,694
28670,Spaz,67
22190,bawk,4431
29584,alfred,142
27698,brian,379
24372,peter,22
25064,weinberger,8
下面是我的简单awk脚本:
#!/usr/local/bin/gawk -f
BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; OFS=","; OFMT="%.2f"; }
NR > 1
END { if ($3>1336) $4=$3*0.03; if ($3<1336) $4=$3*0.05;}1**
输出错误:
31590,Foo,70
28327,Bar,291
28327,Bar,291
25155,Baz,583
25155,Baz,583
24179,Food,694
24179,Food,694
28670,Spaz,67
28670,Spaz,67
22190,bawk,4431
22190,bawk,4431
29584,alfred,142
29584,alfred,142
27698,brian,379
27698,brian,379
24372,peter,22
24372,peter,22
25064,weinberger,8
25064,weinberger,8
异常输出:
31590,Foo,70,3.5
28327,Bar,291,14.55
25155,Baz,583,29.15
24179,Food,694,34.7
28670,Spaz,67,3.35
22190,bawk,4431,132.93
29584,alfred,142,7.1
27698,brian,379,18.95
24372,peter,22,1.1
25064,weinberger,8,.04
简单的数学运算是,如果字段$3 > 1336 = $3*.03,则结果为字段$4字段$3 < 1336 = $3*.05,则结果为字段$4
5条答案
按热度按时间13z8s7eq1#
不需要强制awk重新编译每一条记录(通过赋值为$4),只需打印当前记录,然后输出计算结果:
dphi5xsq2#
在END块中不应该有任何内容
这导致
wswtfjt73#
讨论
END
块不是在每一行的末尾执行,而是在整个文件的末尾执行。因此,它在这里没有帮助。原始代码有两个独立的条件,
NR>1
和1
。每一个的默认操作都是打印该行。这就是为什么在“错误输出”中,第一行之后的所有行都在输出中加倍。zxlwwiss4#
awk
:conditional-expression ? action1 : action2 ;
是awk中更短的三进制运算符。i7uq4tfw5#