Есть много способов игнорировать строку с делителем нуля, в том числе:
awk '$3 != 0 { print $1/$3 }' your-data-file
awk '{ if ($3 != 0) print $1/$3 }' your-data-file
Вопрос изменился & mdash; вместо этого вывести 0 Ответ не намного сложнее:
awk '{ if ($3 != 0) print $1/$3; else print 0 }' your-data-file
Медианы и другие процентили гораздо сложнее иметь дело. Проще всего, если данные в отсортированном порядке. Намного проще, чем я ожидал бы использовать числовую сортировку и затем обработать данные оттуда.
Я выкопал старый сценарий оболочки, который вычисляет описательную статистику - мин, макс, режим, медиана и децили одного столбца данных:
: "@(#)$Id: dstats.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
# Calculate Descriptive Statistics: min, max, median, mode, deciles
sort -n $* |
awk 'BEGIN { max = -999999999; min = 999999999; }
{ # Accumulate basic data
count[$1]++;
item[++n] = $1;
if ($1 > max) max = $1;
if ($1 < min) min = $1;
}
END { # Print Descriptive Statistics
printf("# Count = %d\n", n);
printf("# Min = %d\n", min);
decile = 1;
for (decile = 10; decile < 100; decile += 10)
{
idx = int((decile * n) / 100) + 1;
printf("# %d%% decile = %d\n", decile, item[idx]);
if (decile == 50)
median = item[idx];
}
printf("# Max = %d\n", max);
printf("# Median = %d\n", median);
for (i in count)
{
if (count[i] > count[mode])
mode = i;
}
printf("# Mode = %d\n", mode);
}'
Начальные значения min
и max
не совсем научные. Это служит иллюстрацией.
(Эта версия 1997 года практически идентична предшествующей версии 1991 года - фактически все, кроме строки информации о версии, идентичны. Итак, коду более 20 лет.)