2012-09-07 66 views
0

我正在努力取出sar的輸出並計算一列的標準偏差。我可以用文件中的單個列成功執行此操作。然而,當我在一個文件中計算同一列時,我將標題行和平均行等「壞」行剝離出來,這給了我不同的價值。awk搜索並計算標準偏差不同的結果

下面是我在執行此文件:基礎上的/ tmp

/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 

計算/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命令是可取的。

謝謝!

UPDATE

所以我想這個...

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 

,它可以正確處理特區-u輸出I與合作。我不明白爲什麼它不適用於其他'名單'。爲了簡短起見,嘗試使用sar -r第5列。它再次給出錯誤的答案...輸出給出1.68891,但實際偏差爲.107374 ...這與sar -u一起使用的命令是相同的。 ....如果你需要我可以提供的文件。只是不知道如何做一個新的「全面的」評論...所以我只是編輯舊的...謝謝!

+0

爲了調試這個,打印出一些基本數據:項目的數量和值的總和(以及平均值)。這可能會告訴你有什麼不同。如果我不得不猜測,我會懷疑某處存在空行,所以計數是不同的。 –

回答

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 
+0

這很好,仍然試圖弄清楚(從來沒有數學好),但非常感謝! – user1601716

+0

@ user1601716不要忘記接受答案,如果它解決了您的問題 – jordanm

+0

剛發現一個問題,不知道怎麼回事。新數據如下... – user1601716

0

對於像這樣的調試問題,最簡單的技術是打印出一些基本數據。您可以打印項目的數量和值的總和以及值的平方和(或平均偏差的平方和)。這可能會告訴你兩次運行之間有什麼不同。有時候,當你累積數據時,它可能有助於打印出你積累的值。如果我不得不猜測,我會懷疑你正在計算不合適的線條(空白或裝飾線),所以計數是不同的(也可能是和數)。

我有一對(非標準)程序來做計算。鑑於從多列輸出的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。

+0

pstats從哪裏來?我無法找到它... – user1601716

+0

這是我的;我寫的。這是一個Perl腳本(參數統計)。發送電子郵件,如果你想要一份副本(見我的個人資料)。 –

+0

認真??如果它是你答案的一部分,你爲什麼不上傳代碼? – insumity