получить среднее значение для всех чисел с нерегулярными столбцами

получить среднее значение для всех чисел с нерегулярными столбцами

Можно ли awkработать с нерегулярными столбцами? Т.е. у меня есть файл, как показано ниже, в котором каждый столбец может иметь разное количество значений.

Как получить среднее значение всех положительных значений?

Обратите внимание, что неполные строки не содержат пробелов, поэтому вы не можете использовать sedих для замены.

1 2 3 7
4 5
5 0
0 8 9
0

Я знаю, как получить среднее значение для обычных файлов, как показано ниже, но это не сработает, если последняя строка не полная (4 числа). Плюс код ниже может вывести среднее значение только для каждого столбца отдельно.

Мне нужно среднее значение для всех ненулевых чисел, а не для каждого столбца.

Как это использовать awkили pythonсделать?

Ожидаемый результат — одно число:4.888888889
((1+2+3+7+4+5+5+8+9)/9=4.888888889)

awk '{for (i=1;i <= NF; i++) if ($i>0) { sum[i] += $i; num[i]++; } } END { for(i =1;i <= NF; i++) print i, sum[i]/num[i]}' $infile

решение1

Если вам нужно среднее значение всех чисел во всех столбцах, то это просто

awk '   { for (i=1;i<=NF  ;i++){ sum+=$i;num++} }
     END{ print(sum/num) } ' infile

Если вам нужно среднее значение по столбцу, просто отслеживайте максимальное количество столбцов:

awk '   {for (i=1;i<=NF  ;i++){ if(maxF<NF){maxF=NF};sum[i]+=$i;num[i]++} }
     END{for (i=1;i<=maxF;i++){ print(i,sum[i]/num[i]) } } ' infile

решение2

ГНУawkподход:

awk -v FPAT='[1-9][0-9]*' '{ n += NF; for (i=1;i<=NF;i++) sum += $i }END{ print sum/n }' file

Выход:

4.88889

решение3

Я бы заменил пробелы на новые строки и использовал бы по одному числу на строку:

tr ' ' '\n' <"$infile" | awk '$1 > 0 {n++; sum+=$1} END {if (n>0) print sum/n}'

Связанный контент