Используя awk, как усреднить числа в столбце между двумя строками в текстовом файле - PullRequest
0 голосов
/ 14 апреля 2020

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

Code 1 (3)
5     10      7      1      1
6     10      9      1      1
7     10     10      1      1
Code 2 (2)
9     11      3      1      3
10     8      5      2      1
Code 3 (1)
12    10      2      1      1
Code 4 (2)
14     8      1      1      3
15     8      7      5      1

Я хотел бы усреднить числа в третьем столбце для каждого блока кода. Ниже приведен пример того, как должен выглядеть вывод:

8.67
4
2
4

Попытка 1

awk '$3~/^[[:digit:]]/ {i++; sum+=$3; print $3} $3!~/[[:digit:]]/ {print sum/i; sum=0;i=0}' in.txt

Возвращено fatal: division by zero attempted.

Попытка 2

awk -v OFS='\t' '/^Code/ { if (NR > 1) {i++; sum+=$3;} {print sum/i;}}' in.txt

Возвращено еще одно деление с нулевой ошибкой.

Попытка 3

awk -v OFS='\t' '/^Code/ { if (NR > 1) { print s/i; s=0; i=0; } else { s += $3; i += 1; }}' in.txt

Возвращено 1 значение: 0.

Попытка 4

awk -v OFS='\t' '/^Code/ {
   if (NR > 1)
      i++
      print sum += $3/i
}
END {
   i++
   print sum += $3/i
}' 

Возвращено:

0
0
0
0.3

Я не уверен, откуда исходит последнее число, но до сих пор это было самое близкое решение. Я получаю число для каждого блока, но не среднее число.

1 Ответ

1 голос
/ 14 апреля 2020

Не могли бы вы попробовать следующее.

awk '
/^Code/{
  if(value!=0 && value){
    print sum/value
  }
  sum=value=""
  next
}
{
  sum+=$NF;
  value++
}
END{
  if(value!=0 && value){
    print sum/value
  }
}
' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...