web-dev-qa-db-ja.com

Linuxで数値の統計を出力するコマンドラインユーティリティ

私はしばしば、1行に1つの番号を持つファイルを見つけます。中央値、標準偏差などを表示するために、Excelにインポートします。

同じことをするコマンドラインユーティリティがLinuxにありますか?通常、平均、中央値、最小値、最大値、標準偏差を見つける必要があります。

61
MK.

これはRで簡単です。このようなファイルの場合:

_1
2
3
4
5
6
7
8
9
10
_

これを使って:

_R -q -e "x <- read.csv('nums.txt', header = F); summary(x); sd(x[ , 1])"
_

これを取得するには:

_       V1       
 Min.   : 1.00  
 1st Qu.: 3.25  
 Median : 5.50  
 Mean   : 5.50  
 3rd Qu.: 7.75  
 Max.   :10.00  
[1] 3.02765
_

編集して、いくつかの明確なコメントを追加します(私はこれに戻って、その根拠の一部を覚えていなかったため):

  • _-q_フラグは、Rの起動ライセンスとヘルプ出力を抑制します
  • _-e_フラグは、ターミナルから式を渡すことをRに伝えます
  • xは_data.frame_-基本的にはテーブルです。これは、データの複数のベクトル/列に対応する構造であり、単一のベクトルを読み取るだけの場合は少し独特です。これは、使用できる機能に影響を与えます。
  • summary()などの一部の関数は、当然_data.frames_に対応します。 xに複数のフィールドがある場合、summary()はそれぞれについて上記の統計情報を提供します。
  • しかし、sd()は一度に1つのベクトルしか取得できないため、そのコマンドに対してxをインデックス付けします(_x[ , 1]_はxの最初の列を返します)。 apply(x, MARGIN = 2, FUN = sd)を使用して、すべての列のSDを取得できます。
52
Matt Parker

「st」の使用( https://github.com/nferraz/st

$ st numbers.txt
N    min   max   sum   mean  stddev
10   1     10    55    5.5   3.02765

または:

$ st numbers.txt --transpose
N      10
min    1
max    10
sum    55
mean   5.5
stddev 3.02765

(免責事項:私はこのツールを書きました:))

37
user2747481

平均、中央値、標準偏差には、awkを使用できます。通常、これはRソリューションよりも高速です。たとえば、以下は平均値を出力しますwill:

awk '{a+=$1} END{print a/NR}' myfile

NRはレコード数のawk変数です。$1は行の最初の(スペースで区切られた)引数を意味します($0は行全体になりますここでも機能しますが、原則として安全性は低くなりますが、計算ではおそらく最初の引数を取るだけです)ENDは、ファイル全体を処理した後に次のコマンドが実行されることを意味します( 0ステートメントでaBEGIN{a=0}に初期化することもできます)。

以下に、より詳細な統計情報を提供する簡単なawkスクリプトを示します(CSVファイルを入力として使用し、それ以外の場合はFSを変更します)。

#!/usr/bin/awk -f

BEGIN {
    FS=",";
}
{
   a += $1;
   b[++i] = $1;
}
END {
    m = a/NR; # mean
    for (i in b)
    {
        d += (b[i]-m)^2;
        e += (b[i]-m)^3;
        f += (b[i]-m)^4;
    }
    va = d/NR; # variance
    sd = sqrt(va); # standard deviation
    sk = (e/NR)/sd^3; # skewness
    ku = (f/NR)/sd^4-3; # standardized kurtosis
    print "N,sum,mean,variance,std,SEM,skewness,kurtosis"
    print NR "," a "," m "," va "," sd "," sd/sqrt(NR) "," sk "," ku
}

このスクリプトにmin/maxを追加するのは簡単ですが、sorthead/tailをパイプするのも簡単です。

sort -n myfile | head -n1
sort -n myfile | tail -n1

Y A。 ASCIIモードはministatです。これはFreeBSDからのツールですが、Debian/Ubuntu。

使用例:

$ cat test.log 
Handled 1000000 packets.Time elapsed: 7.575278
Handled 1000000 packets.Time elapsed: 7.569267
Handled 1000000 packets.Time elapsed: 7.540344
Handled 1000000 packets.Time elapsed: 7.547680
Handled 1000000 packets.Time elapsed: 7.692373
Handled 1000000 packets.Time elapsed: 7.390200
Handled 1000000 packets.Time elapsed: 7.391308
Handled 1000000 packets.Time elapsed: 7.388075

$ cat test.log| awk '{print $5}' | ministat -w 74
x <stdin>
+--------------------------------------------------------------------------+
| x                                                                        |
|xx                                   xx    x x                           x|
|   |__________________________A_______M_________________|                 |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x   8      7.388075      7.692373       7.54768     7.5118156    0.11126122
19

うん、それはPerlと呼ばれています
そしてここに簡潔なワンライナーがあります:

Perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; Push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'

$ cat tt
1
3
4
5
6.5
7.
2
3
4

そして、コマンド

cat tt | Perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; Push(@a,$_)}; $n=@a;$s=sum(@a);$a=$s/@a;$m=max(@a);$mm=min(@a);$std=sqrt($sqsum/$n-($s/$n)*($s/$n));$mid=int @a/2;@srtd=sort @a;if(@a%2){$med=$srtd[$mid];}else{$med=($srtd[$mid-1]+$srtd[$mid])/2;};print "records:$n\nsum:$s\navg:$a\nstd:$std\nmed:$med\max:$m\min:$mm";'
records:9
sum:35.5
avg:3.94444444444444
std:1.86256162380447
med:4
max:7.
min:1
15
bua

平均:

awk '{sum += $1} END {print "mean = " sum/NR}' filename

中央値:

gawk -v max=128 '

    function median(c,v,    j) { 
       asort(v,j) 
       if (c % 2) return j[(c+1)/2]
       else return (j[c/2+1]+j[c/2])/2.0
    }

    { 
       count++
       values[count]=$1
       if (count >= max) { 
         print  median(count,values); count=0
       } 
    } 

    END { 
       print  "median = " median(count,values)
    }
    ' filename

モード:

awk '{c[$1]++} END {for (i in count) {if (c[i]>max) {max=i}} print "mode = " max}' filename

このモードの計算には偶数個のサンプルが必要ですが、どのように機能するかがわかります...

標準偏差:

awk '{sum+=$1; sumsq+=$1*$1} END {print "stdev = " sqrt(sumsq/NR - (sum/NR)**2)}' filename
11
ghoti

data_hacksはPython基本的な統計のためのコマンドラインユーティリティ。

そのページの最初の例では、目的の結果が生成されます。

$ cat /tmp/data | histogram.py
# NumSamples = 29; Max = 10.00; Min = 1.00
# Mean = 4.379310; Variance = 5.131986; SD = 2.265389
# each * represents a count of 1
    1.0000 -     1.9000 [     1]: *
    1.9000 -     2.8000 [     5]: *****
    2.8000 -     3.7000 [     8]: ********
    3.7000 -     4.6000 [     3]: ***
    4.6000 -     5.5000 [     4]: ****
    5.5000 -     6.4000 [     2]: **
    6.4000 -     7.3000 [     3]: ***
    7.3000 -     8.2000 [     1]: *
    8.2000 -     9.1000 [     1]: *
    9.1000 -    10.0000 [     1]: *
8
Matt Parker

念のため、 datastat があります。これは、コマンドラインから単純な統計を計算するLinux用の単純なプログラムです。例えば、

cat file.dat | datastat

file.datの各列のすべての行の平均値を出力します。標準偏差、最小、最大を知る必要がある場合は、--dev--minおよび--maxオプション。

datastatには、1つ以上の「キー」列の値に基づいて行を集約する可能性があります。例えば、

cat file.dat | datastat -k 1

最初の列(「キー」)にある異なる値ごとに、キーの同じ値を持つすべての行で集計された他のすべての列値の平均を生成します。キーフィールドとしてより多くの列を使用できます(例:-k 1-3、-k 2,4など)。

C++で書かれており、高速でメモリ使用量が少なく、cutgrepsedsortなどの他のツールでうまくパイプできます。 、awkなど。

7
Tommaso

clistats の使用を検討することもできます。区切り文字で区切られた入力番号のストリームの統計を計算するための高度に構成可能なコマンドラインインターフェイスツールです。

I/Oオプション

  • 入力データは、ファイル、標準入力、またはパイプから取得できます
  • 出力は、ファイル、標準出力、またはパイプに書き込むことができます
  • 出力は「#」で始まるヘッダーを使用して、gnuplotへのパイピングを有効にします

解析オプション

  • シグナル、ファイルの終わり、または空白行ベースの検出による処理の停止
  • コメントと区切り文字を設定できます
  • 列を処理から除外することができます
  • 数値制約に基づいて行を処理から除外できます
  • 文字列の制約に基づいて、行を処理から除外できます
  • 最初のヘッダー行はスキップできます
  • 固定行数を処理できます
  • 重複する区切り文字は無視できます
  • 行を列に再構成できます
  • 同じサイズの行のみが処理されるように厳密に実施する
  • 列タイトルを含む行を使用して、出力統計にタイトルを付けることができます

統計オプション

  • 要約統計(カウント、最小、平均、最大、標準偏差)
  • 共分散
  • 相関
  • 最小二乗オフセット
  • 最小二乗法面
  • ヒストグラム
  • フィルタリング後の生データ

注:私は著者です。

7
dpmcmlxxvi

私はシェルパイプラインでこれを行いたいと思っていましたが、Rのすべての適切な引数を取得するにはしばらく時間がかかりました。ここに私が思いついたものがあります:

seq 10 | R --slave -e 'x <- scan(file="stdin",quiet=TRUE); summary(x)' Min. 1st Qu. Median Mean 3rd Qu. Max. 1.00 3.25 5.50 5.50 7.75 10.00

--slaveオプション "Rをできるだけ静かに実行します... --quietおよび--no-saveを意味します。"-eオプションはRに通知します次の文字列をRコードとして処理します。最初のステートメントは標準入力から読み取り、読み取ったものを「x」という変数に格納します。 scan 関数のquiet=TRUEオプションは、読み取られたアイテムの数を示す行の書き込みを抑制します。 2番目のステートメントは summary 関数をxに適用し、出力を生成します。

6
Jose Quinteiro

さらに別のツール: https://www.gnu.org/software/datamash/

# Example: calculate the sum and mean of values 1 to 10:
$ seq 10 | datamash sum 1 mean 1
55 5.5

より一般的にパッケージ化される可能性があります(少なくともnix用にプリパッケージ化された最初のツール)

5
olejorgenb

Simple-rもあります。これは、Rができることのほとんどすべてを実行できますが、キーストロークは少なくて済みます。

https://code.google.com/p/simple-r/

基本的な記述統計を計算するには、次のいずれかを入力する必要があります。

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

平均、中央値、最小値、最大値、標準偏差のそれぞれについて、コードは次のようになります。

seq 1 100 | r mean - 
seq 1 100 | r median -
seq 1 100 | r min -
seq 1 100 | r max -
seq 1 100 | r sd -

Simple-Rを取得しません!

3
Tom
#!/usr/bin/Perl
#
# stdev - figure N, min, max, median, mode, mean, & std deviation
#
# pull out all the real numbers in the input
# stream and run standard calculations on them.
# they may be intermixed with other test, need
# not be on the same or different lines, and 
# can be in scientific notion (avagadro=6.02e23).
# they also admit a leading + or -.
#
# Tom Christiansen
# [email protected]

use strict;
use warnings;

use List::Util qw< min max >;

#
my $number_rx = qr{

  # leading sign, positive or negative
    (?: [+-] ? )

  # mantissa
    (?= [0123456789.] )
    (?: 
        # "N" or "N." or "N.N"
        (?:
            (?: [0123456789] +     )
            (?:
                (?: [.] )
                (?: [0123456789] * )
            ) ?
      |
        # ".N", no leading digits
            (?:
                (?: [.] )
                (?: [0123456789] + )
            ) 
        )
    )

  # abscissa
    (?:
        (?: [Ee] )
        (?:
            (?: [+-] ? )
            (?: [0123456789] + )
        )
        |
    )
}x;

my $n = 0;
my $sum = 0;
my @values = ();

my %seen = ();

while (<>) {
    while (/($number_rx)/g) {
        $n++;
        my $num = 0 + $1;  # 0+ is so numbers in alternate form count as same
        $sum += $num;
        Push @values, $num;
        $seen{$num}++;
    } 
} 

die "no values" if $n == 0;

my $mean = $sum / $n;

my $sqsum = 0;
for (@values) {
    $sqsum += ( $_ ** 2 );
} 
$sqsum /= $n;
$sqsum -= ( $mean ** 2 );
my $stdev = sqrt($sqsum);

my $max_seen_count = max values %seen;
my @modes = grep { $seen{$_} == $max_seen_count } keys %seen;

my $mode = @modes == 1 
            ? $modes[0] 
            : "(" . join(", ", @modes) . ")";
$mode .= ' @ ' . $max_seen_count;

my $median;
my $mid = int @values/2;
if (@values % 2) {
    $median = $values[ $mid ];
} else {
    $median = ($values[$mid-1] + $values[$mid])/2;
} 

my $min = min @values;
my $max = max @values;

printf "n is %d, min is %g, max is %d\n", $n, $min, $max;
printf "mode is %s, median is %g, mean is %g, stdev is %g\n", 
    $mode, $median, $mean, $stdev;
3
tchrist

別のツール:tsv-summarize、from eBayのtsvユーティリティ 。最小、最大、平均、中央値、標準偏差がすべてサポートされています。大規模なデータセットを対象としています。例:

$ seq 10 | tsv-summarize --min 1 --max 1 --median 1 --stdev 1
1    10    5.5    3.0276503541

免責事項:私は著者です。

2
JonDeg

xsv を使用:

$ echo '3 1 4 1 5 9 2 6 5 3 5 9' |tr ' ' '\n' > numbers-one-per-line.csv

$ xsv stats -n < numbers-one-per-line.csv 
field,type,sum,min,max,min_length,max_length,mean,stddev
0,Integer,53,1,9,1,1,4.416666666666667,2.5644470922381863

# mode/median/cardinality not shown by default since it requires storing full file in memory:
$ xsv stats -n --everything < numbers-one-per-line.csv | xsv table
field  type     sum  min  max  min_length  max_length  mean               stddev              median  mode  cardinality
0      Integer  53   1    9    1           1           4.416666666666667  2.5644470922381863  4.5     5     7
1
unhammer