
Можно ли 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}'