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}'