Unix awk if语句与简单数学

Unix awk if语句与简单数学,unix,awk,gawk,Unix,Awk,Gawk,我只是想在CSV文件上做一些基本的计算 数据: 以下是我的简单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,29

我只是想在CSV文件上做一些基本的计算

数据:

以下是我的简单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

结束块中不应该有任何内容

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

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

With
awk

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

条件表达式?行动1:行动2
是awk中较短的三进制运算符。

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

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

我明白了,我错过了一对{还有整个else语句。事实上,你没有遗漏任何大括号,我想我只是出于习惯添加了大括号。如果if语句后面的代码只有一行,则不需要大括号。而且它知道要将结果打印到第四个字段,因为$0?不,它不处理任何字段,只是输出它读取的记录($0)然后是计算结果。结果是输出中有4个逗号分隔的字段,但脚本没有以任何方式修改任何字段,因此不会导致$0重新编译。如果您有一个大文件,您会发现它的运行速度明显快于打印前分配给$4的任何解决方案。您如何处理没有负数的e减法?在字段$4中,结果小于20,所以我需要20-$4,但在$5中是负数:
{print$0,$4-($4>20?$4:20)}
对不起,我不知道你在说什么。你的问题中既没有$4也没有$5。也许可以发布一个新问题?。
awk -F, -v OFS=, '$3>1336?$4=$3*.03:$4=$3*.05' file
awk 'BEGIN{FS=OFS=","; OFMT="%.2f"} {print $0, $3*($3>1336?0.03:0.05)}' file