0

sarの出力を取得し、列の標準偏差を計算するように取り組んでいます。これは、ファイル内の1つの列で正常に実行できます。ただし、タイトル行や平均行などの「不良」行を削除しているファイルでこの同じ列を計算すると、異なる値が得られます。

これを実行しているファイルは次のとおりです。

/tmp/saru.tmp

# cat /tmp/saru.tmp
Linux 2.6.32-279.el6.x86_64 (progserver)        09/06/2012      _x86_64_        (4 CPU)

11:09:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:10:01 PM     all      0.01      0.00      0.05      0.01      0.00     99.93
11:11:01 PM     all      0.01      0.00      0.06      0.00      0.00     99.92
11:12:01 PM     all      0.01      0.00      0.05      0.01      0.00     99.93
11:13:01 PM     all      0.01      0.00      0.05      0.00      0.00     99.93
11:14:01 PM     all      0.01      0.00      0.04      0.00      0.00     99.95
11:15:01 PM     all      0.01      0.00      0.06      0.00      0.00     99.92
11:16:01 PM     all      0.01      0.00      2.64      0.01      0.01     97.33
11:17:01 PM     all      0.02      0.00     21.96      0.00      0.08     77.94
11:18:01 PM     all      0.02      0.00     21.99      0.00      0.08     77.91
11:19:01 PM     all      0.02      0.00     22.10      0.00      0.09     77.78
11:20:01 PM     all      0.02      0.00     22.06      0.00      0.09     77.83
11:21:01 PM     all      0.02      0.00     22.10      0.03      0.11     77.75
11:22:01 PM     all      0.01      0.00     21.94      0.00      0.09     77.95
11:23:01 PM     all      0.02      0.00     22.15      0.00      0.10     77.73
11:24:01 PM     all      0.02      0.00     22.02      0.00      0.09     77.87
11:25:01 PM     all      0.02      0.00     22.03      0.00      0.13     77.82
11:26:01 PM     all      0.02      0.00     21.96      0.01      0.14     77.86
11:27:01 PM     all      0.02      0.00     22.00      0.00      0.09     77.89
11:28:01 PM     all      0.02      0.00     21.91      0.00      0.09     77.98
11:29:01 PM     all      0.03      0.00     22.02      0.02      0.08     77.85
11:30:01 PM     all      0.14      0.00     22.23      0.01      0.13     77.48
11:31:01 PM     all      0.02      0.00     22.26      0.00      0.16     77.56
11:32:01 PM     all      0.03      0.00     22.04      0.01      0.10     77.83
Average:        all      0.02      0.00     15.29      0.01      0.07     84.61

/tmp/sarustriped.tmp

# cat /tmp/sarustriped.tmp                              
0.05
0.06
0.05
0.05
0.04
0.06
2.64
21.96
21.99
22.10
22.06
22.10
21.94
22.15
22.02
22.03
21.96
22.00
21.91
22.02
22.23
22.26
22.04

/tmp/saru.tmpに基づく計算:

# awk  '$1~/^[01]/ && $6~/^[0-9]/ {sum+=$6; array[NR]=$6} END {for(x=1;x<=NR;x++){sumsq+=((array[x]-(sum/NR))**2);}print sqrt(sumsq/NR)}' /tmp/saru.tmp
10.7126

/tmp/sarustriped.tmp(正しいもの)に基づく計算

# awk '{sum+=$1; array[NR]=$1} END {for(x=1;x<=NR;x++){sumsq+=((array[x]-(sum/NR))**2);}print sqrt(sumsq/NR)}' /tmp/sarustriped.tmp
9.96397

誰かが助けて、これらの結果が異なる理由を教えてもらえますか?単一のawkコマンドで修正された結果を取得する方法はありますか?私はパフォーマンスのためにこれを行おうとしているので、grepや別のawkコマンドのような別のコマンドを使用しないことが望ましいです。

ありがとう!

アップデート

だから私はこれを試しました...

awk  '
  $1~/^[01]/ && $6~/^[0-9]/ {
    numrec += 1
    sum    += $6
    array[numrec] = $6
  } 
  END {
    for(x=1; x<=numrec; x++)
      sumsq += ((array[x]-(sum/numrec))^2)
    print sqrt(sumsq/numrec)
  }
' saru.tmp
 

そして、それは私が使っていたsar-u出力に対して正しく機能します。他の「リスト」で機能しない理由がわかりません。簡単に言うと、sar -r列5を操作しようとすると、間違った答えが返されます...出力は1.68891を返しますが、実際の偏差は.107374です...これはsar-uを操作したのと同じコマンドです。 ....私が提供できるファイルが必要な場合。新しい「完全な」コメントを作成する方法がわからない...だから私は古いものを編集した...ありがとう!

4

2 に答える 2

3

バグは、最初の awk 行 (saru.tmp で動作する行) が無効な行を無視しないため、NR を使用して計算すると、結果はスキップされた行の数に依存することだと思います。無効/スキップされた行をすべて削除すると、結果は両方のプログラムで同じになります。したがって、最初のコマンドでは、数学で NR ではなく有効な行の数を使用する必要があります。

これはどう?

awk '
  $1 ~ /^[01]/ && $6~/^[0-9]/ {
    numrec       += 1
    sum          += $6
    array[numrec] = $6
  } 
  END {
    for(x=1; x<=numrec; x++)
      sumsq += (array[x]-(sum/numrec))^2
    print sqrt(sumsq/numrec)
  }
' saru.tmp
于 2012-09-07T00:17:18.933 に答える
0

このような問題をデバッグするための最も簡単な方法は、いくつかの基本データを出力することです。アイテムの数、値の合計、および値の二乗の合計 (または平均からの偏差の二乗の合計) を出力できます。これにより、2 つの実行の違いがわかります。データを蓄積しているときに、蓄積している値を出力すると役立つ場合があります。推測する必要がある場合は、不適切な行 (空白または装飾行) をカウントしていると思われるため、カウントが異なります (おそらく合計も)。

計算を行うための(非標準の)プログラムがいくつかあります。file の複数列出力から関連する 23 行を指定して、次のコマンドdataを実行しました。

$ colnum -c 6 data | pstats
# Count    = 23
# Sum(x1)  =  3.557200e+02
# Sum(x2)  =  7.785051e+03
# Mean     =  1.546609e+01
# Std Dev  =  1.018790e+01
# Variance =  1.037934e+02
# Min      =  4.000000e-02
# Max      =  2.226000e+01
$

ここでの標準偏差は、母集団の標準偏差ではなく、サンプルの標準偏差です。差は、サンプルの場合は (N-1) で、母集団の場合は N で割ります。

于 2012-09-07T00:24:38.860 に答える