Подтвердить что ты не робот

Утилита командной строки для печати статистики чисел в Linux

Я часто нахожусь в файле с одним номером на строку. Я в конечном итоге импортирую его в excel для просмотра таких вещей, как медианное, стандартное отклонение и т.д.

Есть ли утилита командной строки в linux, чтобы сделать то же самое? Обычно мне нужно найти среднее, среднее, минимальное, максимальное и std отклонение.

4b9b3361

Ответ 1

Это бриз с 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() может принимать только один вектор за раз, поэтому я индексирую x для этой команды (x[ , 1] возвращает первый столбец x). Вы можете использовать apply(x, MARGIN = 2, FUN = sd), чтобы получить SD для всех столбцов.

Ответ 2

Использование "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

(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я написал этот инструмент:))

Ответ 3

Для среднего, среднего и стандартного отклонения вы можете использовать awk. Как правило, это будет быстрее, чем решения R Например, следующее напечатает среднее:

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

(NR - это переменная awk для количества записей, $1 означает первый (разделенный пробелами) аргумент строки ($0 будет целой строкой, которая также будет работать здесь, но в принципе будет менее безопасной, хотя для вычисления в любом случае это, вероятно, просто примет первый аргумент), а END означает, что следующие команды будут выполнены после обработки всего файла (можно также инициализировать a в 0 в операторе BEGIN{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
}

Добавить мин/макс к этому сценарию несложно, но так же просто sort и head/tail:

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

Ответ 4

Y.a. инструмент, который может использоваться для вычисления статистики и просмотра в режиме ASCII, - ministat. Это инструмент от FreeBSD, но он также упакован для популярного дистрибутива Linux, такого как 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

Ответ 5

Да, он называется perl
и вот краткий однострочный:

perl -e 'use List::Util qw(max min sum); @a=();while(<>){$sqsum+=$_*$_; push(@a,$_)}; [email protected];$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,$_)}; [email protected];$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

Ответ 6

Средний:

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

Ответ 7

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

На всякий случай, datastat, простая программа для Linux, использующая простые статистические данные из командной строки. Например,

cat file.dat | datastat

выводит среднее значение по всем строкам для каждого столбца файла .dat. Если вам нужно знать стандартное отклонение, min, max, вы можете добавить опции --dev, --min и --max соответственно.

datastat имеет возможность агрегировать строки на основе значения одного или нескольких столбцов "ключ". Например,

cat file.dat | datastat -k 1

будет производить для каждого различного значения, найденного в первом столбце ( "ключ" ), среднее значение всех других значений столбца, агрегированных среди всех строк с одинаковым значением на ключе. Вы можете использовать больше столбцов в качестве ключевых полей (например, -k 1-3, -k 2,4 и т.д.).

Он написан на С++, работает быстро и с небольшим занятием памяти, и может прекрасно сочетаться с другими инструментами, такими как cut, grep, sed, sort, awk и т.д.

Ответ 9

Вы также можете использовать clistats. Это высоко настраиваемый инструмент интерфейса командной строки для вычисления статистики для потока разделенных входных номеров.

Параметры ввода/вывода

  • Входные данные могут быть из файла, стандартного ввода или канала
  • Вывод может быть записан в файл, стандартный вывод или канал
  • Вывод использует заголовки, начинающиеся с "#", чтобы включить конвейер в gnuplot

Параметры анализа

  • Обнаружение сигнала, конца файла или пустых строк для прекращения обработки
  • Можно указать символ комментария и разделителя
  • Столбцы могут быть отфильтрованы из обработки
  • Строки могут быть отфильтрованы из обработки на основе числового ограничения
  • Строки могут быть отфильтрованы из обработки на основе ограничения строки
  • Исходные строки заголовков могут быть пропущены
  • Исправлено количество строк, которые можно обработать
  • Дублировать разделители можно игнорировать
  • Строки могут быть изменены в столбцы
  • Строго обеспечить, чтобы обрабатывались только строки одного размера.
  • Строка, содержащая заголовки столбцов, может использоваться для отображения статистики вывода

Параметры статистики

  • Сводная статистика (количество, минимальное, среднее, максимальное, стандартное отклонение)
  • ковариация
  • Корреляция
  • Смещение наименьших квадратов
  • Наклон наименьших квадратов
  • Гистограмма
  • Исходные данные после фильтрации

ПРИМЕЧАНИЕ. Я автор.

Ответ 10

Еще один инструмент: 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)

Ответ 11

Я обнаружил, что хочу сделать это в конвейере оболочки, и все правильные аргументы для 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 "Make (s) R работает как можно тише... Это подразумевает --quiet и --no-save". Опция -e указывает R обрабатывать следующую строку как R-код. Первое утверждение читает из стандарта in и сохраняет то, что читается в переменной с именем "x". Параметр quiet=TRUE для функции scan подавляет запись строки, в которой указано, сколько элементов было прочитано. Второе утверждение применяет summary функцию к x, которая выводит результат.

Ответ 12

#!/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;

Ответ 13

Существует также простой-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 -

Не получается простой-R!

Ответ 14

Еще один инструмент: tsv-summarize, из утилиты eBay tsv. Мин, макс, средний, средний, стандартное отклонение поддерживаются. Предназначен для больших наборов данных. Пример:

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

Отказ от ответственности: Я автор.

Ответ 15

Использование 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