仕事で見積もりを作る際、ファイルサイズの統計(平均や中央値)が欲しかったので少し調べてみた。
で、いくつかの手法があることがわかったので、備忘として残しておく。

1.awkで計算する

まずは、一番準備が手軽なawkでの計算方法。
基本、どのUNIX系OSでも入ってるので、とりあえずはすぐ使えるだろう(Macとかの場合はgawkにしたほうが良いけど)。

以下、ざっと項目別に出すコマンドを書いてみる。

平均

awk '{x++;sum+=$1}END {print sum/x}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | awk '{x++;sum+=$1}END {print sum/x}'
2645.75

中央値(ソートが必要)

awk '{v[i++]=$1;}END {x=int((i+1)/2); if(x<(i+1)/2) print (v[x-1]+v[x])/2; else print v[x-1];}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" |sort -n | awk '{v[i++]=$1;}END {x=int((i+1)/2); if(x<(i+1)/2) print (v[x-1]+v[x])/2; else print v[x-1];}'
352.5

最頻値

awk '{col=$1}{{b[col]++}if(b[col]&gt;hf){hf=b[col]}}END{for (i in b){if(b[i]==hf){(k=="")? (k=i):(k=k FS i)}{FS=","}}print&nbsp;k}'
[root@BS-PUB-CENT7-01 ~]# find /root ! -size 0 -type f -printf "%s\n" | awk '{col=$1}{{b[col]++}if(b[col]>hf){hf=b[col]}}END{for (i in b){if(b[i]==hf){(k=="") ? (k=i):(k=k FS i)}{FS=","}}print  k}'
184

最大・最小値

awk '{if(min==""){min=max=$1};if($1&amp;amp;gt;max){max=$1};if($1&amp;amp;lt; min){min=$1};} END {print min, max}'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | awk '{if(min==""){min=max=$1};if($1>max){max=$1};if($1< min){min=$1};} END {print "min:"min,"\nmax:" max}'
min:0
max:57828

2.stコマンドで取得する

以前、こちらでも紹介したstコマンドを用いた場合。
統計用のコマンドなので、awkよりは簡単に結果を求める事が出来る。

基本

st ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st
N       min     max     sum     mean    stddev
60      0       57828   158745  2645.75 8064.21

平均

st --mean ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --mean
2645.75

中央値

st --median ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --median
352.5

最大・最小値

st --max --min ファイルPATH
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | st --max --min
min     max
0       57828

3.R言語を用いる

統計用の言語であるR言語でターミナル上で処理を行う事で、統計情報を取得する。

サマリー

コマンド | xargs Rscript -e 'summary(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f -printf "%s\n" | xargs Rscript -e 'summary(as.numeric(commandArgs(TRUE)))'
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    0.0   100.8   352.5  2879.0  1405.0 57830.0

平均

コマンド | xargs Rscript -e 'mean(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | xargs Rscript -e 'mean(as.numeric(commandArgs(TRUE)))'
[1] 2832.197

●中央値

コマンド | xargs Rscript -e 'median(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find /root -type f -printf "%s\n" | xargs Rscript -e 'median(as.numeric(commandArgs(TRUE)))'
[1] 342

最頻値

コマンド | xargs Rscript -e 'names(which.max(table(as.numeric(commandArgs(TRUE)))))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'names(which.max(table(as.numeric(commandArgs(TRUE)))))'
[1] "184"

最大値

コマンド | xargs Rscript -e 'max(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'max(as.numeric(commandArgs(TRUE)))'
[1] 57828

最小値

コマンド | xargs Rscript -e 'min(as.numeric(commandArgs(TRUE)))'
[root@BS-PUB-CENT7-01 ~]# find -type f ! -size 0 -printf "%s\n" | xargs Rscript -e 'min(as.numeric(commandArgs(TRUE)))'
[1] 18

今後使うことがあるかわからないけど、とりあえずまた何かあったら役に立つだろう。