bugfix> linux > 投稿

誰かが私が得る理由を見ることができます

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

このスクリプトから?

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
}'

回答 1 件
  • 関数の定義は、awkプログラムの規則の間のどこにでも現れます。 POSIX標準から:

    The awk language also provides user-defined functions. Such functions can be defined as:

    
    function name([parameter, ...]) { statements }
    
    
         

    機能どこでも参照できます awkプログラム内。特に、その使用は定義の前に行うことができます。関数のスコープはグローバルです。関数の定義どこにでも現れることができます パターンとアクションのペアが許可されているプログラム内。

    つまり、有効なawkプログラムは次のようになります。

    ( pattern1 ) { action1 }
    function name([parameter, ...]) { statements }
    ( pattern2 ) { action2 }
    ...
    
    

    元のコードで、間違ったものを書きました

    ( pattern ) { function name([paramter, ...]) { statements }
                 action }
    
    

    だからあなたの 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
         }'
    
    

    更新: コメントから、使用する方が便利かもしれません

    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
    
    

    しかし、平均の平均を取ることは非常に難しいので、これは疑わしいです...

    また興味深いのは sar  コマンド。

あなたの答え