Утилита командной строки для печати статистики чисел в Linux
Я часто нахожусь в файле с одним номером на строку. Я в конечном итоге импортирую его в excel для просмотра таких вещей, как медианное, стандартное отклонение и т.д.
Есть ли утилита командной строки в linux, чтобы сделать то же самое? Обычно мне нужно найти среднее, среднее, минимальное, максимальное и std отклонение.
Ответы
Ответ 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