谁能明白为什么我会得到
awk: cmd. line:8: function mma(num) {
awk: cmd. line:8: ^ syntax error
awk: cmd. line:8: function mma(num) {
awk: cmd. line:8: ^ syntax error
Run Code Online (Sandbox Code Playgroud)
从这个脚本?
echo "0.24 0.21 0.22 1/1282 10953" | awk '{
min=""
max=""
avg=""
# find min, max, avg
function mma(num) {
if(min==""){min=max=$1};
if($1>max) {max=$1};
if($1<min) {min=$1};
total+=$1;
count+=1;
avg=total/count;
}
mma($1)
mma($2)
mma($3)
print avg, max, min
}'
Run Code Online (Sandbox Code Playgroud)
函数的定义可以出现在awk程序的规则之间的任何地方.从POSIX标准:
awk语言还提供用户定义的函数.这些功能可以定义为:
Run Code Online (Sandbox Code Playgroud)function name([parameter, ...]) { statements }函数可以在awk程序中的任何地方引用 ; 特别是,它的使用可以先于其定义.功能的范围是全球性的.<snip>函数定义可以出现在程序中允许使用模式 - 动作对的任何位置.
这意味着有效的awk程序如下所示:
( pattern1 ) { action1 }
function name([parameter, ...]) { statements }
( pattern2 ) { action2 }
...
Run Code Online (Sandbox Code Playgroud)
在您的原始代码中,您写的不正确
( pattern ) { function name([paramter, ...]) { statements }
action }
Run Code Online (Sandbox Code Playgroud)
因此,您的awk部分的更正版本将是:
awk 'function mma(num) {
if(min==""){min=max=$1};
if($1>max) {max=$1};
if($1<min) {min=$1};
total+=$1;
count+=1;
avg=total/count;
}
{ min=""; max=""; avg=""
mma($1); mma($2); mma($3)
print avg, max, min
}'
Run Code Online (Sandbox Code Playgroud)
更新:从评论中,它可能更有用
awk '{ avg=($1+$2+$3)/3; min=avg; max=avg;
min=($1<min) ? $1 : min; max=($1>max) ? $1 : max
min=($2<min) ? $2 : min; max=($2>max) ? $2 : max
min=($3<min) ? $3 : min; max=($3>max) ? $3 : max
print avg,max, min } ' /proc/loadavg
Run Code Online (Sandbox Code Playgroud)
然而,这是值得怀疑的,因为取平均值非常......
同样有趣的可能是sar命令.