我只想尝试对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&gt; 1336 = $ 3 * .03,结果为$ 4 字段$ 3&lt; 1336 = $ 3 * .05,结果为$ 4
答案 0 :(得分:3)
没有必要强制awk重新编译每条记录(通过分配到$ 4),只需打印当前记录,然后计算结果:
awk 'BEGIN{FS=OFS=","; OFMT="%.2f"} {print $0, $3*($3>1336?0.03:0.05)}' file
答案 1 :(得分:2)
你不应该在END块中有任何东西
BEGIN {
FS = OFS = ","
OFMT="%.2f"
}
{
if ($3 > 1336)
$4 = $3 * 0.03
else
$4 = $3 * 0.05
print
}
这导致
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,0.4
答案 2 :(得分:1)
FileReaders
$ awk -F, -v OFS=, '{if ($3>1336) $4=$3*0.03; else $4=$3*0.05;} 1' data
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,0.4
块不会在每行的末尾执行,而是在整个文件的末尾执行。因此,这里没有用。
原始代码有两个独立的条件,END
和NR>1
。每个的默认操作是打印该行。这就是为什么在“错误的输出”中,第一个之后的所有行在输出中加倍。
答案 3 :(得分:1)
使用awk
:
awk -F, -v OFS=, '$3>1336?$4=$3*.03:$4=$3*.05' file
conditional-expression ? action1 : action2 ;
是awk中短得多的三元运算符。