Linux/UNIXのコンソールで平均・中央値・最大・最小を求める
Pocket

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

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]&amp;gt;hf){hf=b[col]}}END{for (i in b){if(b[i]==hf){(k=="")? (k=i):(k=k FS i)}{FS=","}}print&amp;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;amp;gt;max){max=$1};if($1&amp;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
Sponsored Links

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

 

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

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 1 comments

  1. Pingback: 第22回シェル芸勉強会に参加してきました(復習) #1 前半分 | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

メールアドレスが公開されることはありません。