불규칙한 열이 있는 모든 숫자의 평균을 구합니다.

불규칙한 열이 있는 모든 숫자의 평균을 구합니다.

awk불규칙한 열을 처리 할 수 있나요 ? 즉, 각 열의 값 수가 서로 다를 수 있는 아래와 같은 파일이 있습니다.

모든 양수 값의 평균을 찾는 방법은 무엇입니까?

불완전한 줄에는 공백/공백이 포함되어 있지 않으므로 sed해당 공백을 대체하는 데 사용할 수 없습니다.

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

아래와 같이 일반 파일의 평균을 구하는 방법을 알고 있지만 마지막 줄이 불완전하면(4자리) 작동하지 않습니다. 또한 아래 코드는 각 열의 평균만 별도로 인쇄할 수 있습니다.

각 열의 평균이 아닌 0이 아닌 모든 숫자의 평균이 필요합니다.

이것을 사용 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}'

관련 정보