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>1
和1
。每个的默认操作是打印该行。这就是为什么,在 "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
我只是想对 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>1
和1
。每个的默认操作是打印该行。这就是为什么,在 "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