awk if 简单数学语句

awk if statement with simple math

我只是想对 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 (>1336) =*0.03; if (<1336) =*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

END 块中不应包含任何内容

BEGIN {
    FS = OFS = ","
    OFMT="%.2f"
}
{
    if ( > 1336) 
         =  * 0.03
    else 
         =  * 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
$ awk -F, -v OFS=, '{if (>1336) =*0.03; else =*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>11。每个的默认操作是打印该行。这就是为什么,在 "wrong output," 中,第一行之后的所有行在输出中都加倍了。

awk:

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

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

无需强制 awk 重新编译每条记录(通过分配给 $4),只需打印当前记录,然后打印您的计算结果:

awk 'BEGIN{FS=OFS=","; OFMT="%.2f"} {print [=10=], *(>1336?0.03:0.05)}' file