2016-11-09 50 views
2

猛砸大師最大值,我需要計算的最大值和百分位號碼列表中的每個項目,用awk計算百分每個可變

aa 1 
ab 3 
aa 4 
ac 5 
aa 3 
ad 2 
ab 4 
ac 2 
ae 2 
ac 5 

預計輸出

Item 90th percentile max value 
aa  3.8    4 
ab  3.9    4 
ac  5    5 
ad  2    2 
ae  2    2 

我能使用下面的得分和最大值,但不是百分點。

awk '{ 
item[$1]++; 
count[$1]+=$2; 
max[$1]=$2; 
percentile[$1,.9]=$2 
} 
END{ 
for (var in item) 
print var,count[var],max[var],percentile[var] 
} 
' 

請建議。

+1

你在期待'百分[$ 1,0.9] = $ 2'辦? –

+3

你用什麼方法計算百分位數?線性插值 ?最近排名?你在bash中實現了一個函數嗎? – Aserre

+0

@jas他們是1,3和4. – dood

回答

2

百分比計算來自Statistics for Dummies 2nd ed。 :)。在了GNU AWK:

$ cat mnp.awk 
BEGIN { 
    PROCINFO["sorted_in"]="@ind_num_asc" # for order in output 
    if(p=="")        # if p not defined it's median 
     p=0.5 
    else 
     p=p/100       # if 90th percentile: p=0.9 
} 
{ 
    v[$1][NR]=$2       # values stored per keyword. NR for unique 
    if($2>m[$1])       # find max val 
     m[$1]=$2 
} 
END { 
    for(i in v) {       # for all keywords 
     n=asort(v[i])      # sort values, n is count 
     prc=p*n;       # percentile figuration 
     if(prc==int(prc)) 
      w=(v[i][prc]+v[i][prc+1])/2 
     else 
      w=v[i][int(prc)+1] 
     print i, m[i], w     # print keyword, max and nth value 
    } 
} 

運行:

$ awk -p=90 -f mnp.awk data.txt 
aa 4 4 
ab 4 4 
ac 5 5 
ad 2 2 
ae 2 2 

TODO:如果數據文件進行了排序,這可以簡化,而不是所有的數據都需要被存儲到內存中。

+0

這不是OP公佈的預期輸出。 – dood

+1

@dood是的。 OP會給出他想要的百分位數的定義。引用維基百科的百分位數:_沒有百分位數的標準定義,但是當觀測數量非常大時,所有的定義都會產生相似的結果。我使用的定義來自_Statistics for Dummies_第2版。 –

0

這裏是一個完美的解決方案,我發現在互聯網附近浮動尋找最大值:

{ 
    max[$1] = !($1 in max) ? $2 : ($2 > max[$1]) ? $2 : max[$1] 
} 
END { 
    for (i in max) 
    print i, max[i] 
} 

輸出:

ab 4 
ac 5 
ad 2 
ae 2 
aa 4 
+1

你只需要'max [$ 1] =((最大$ 1)&&(max [$ 1]> $ 2)?max [$ 1]:$ 2)'避免負面('!')並重復(設置爲'$ 2'在多個位置)語法。 –

0

datamash是一個可愛的工具,雖然它不支持過度的部分。

$ datamash -W --sort --group=1 max 2 min 2 < INPUT 
aa 4 1 
ab 4 3 
ac 5 2 
ad 2 2 
ae 2 2 

它支持以下操作

File operations: 
    transpose, reverse 
Numeric Grouping operations: 
    sum, min, max, absmin, absmax 
Textual/Numeric Grouping operations: 
    count, first, last, rand 
    unique, collapse, countunique 
Statistical Grouping operations: 
    mean, median, q1, q3, iqr, mode, antimode 
    pstdev, sstdev, pvar, svar, mad, madraw 
    pskew, sskew, pkurt, skurt, dpo, jarque