awk if语句简单的数学

时间:2015-06-10 22:30:00

标签: unix awk gawk

我只想尝试对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

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 块不会在每行的末尾执行,而是在整个文件的末尾执行。因此,这里没有用。

原始代码有两个独立的条件,ENDNR>1。每个的默认操作是打印该行。这就是为什么在“错误的输出”中,第一个之后的所有行在输出中加倍。

答案 3 :(得分:1)

使用awk

awk -F, -v OFS=, '$3>1336?$4=$3*.03:$4=$3*.05' file

conditional-expression ? action1 : action2 ;是awk中短得多的三元运算符。