행렬 계산 및 0으로 나누기 방지

행렬 계산 및 0으로 나누기 방지

데이터 테이블에 있는 값의 평균을 계산하고 싶습니다.

데이터 매트릭스 예

S1  1   3   4   5   16  3   3   4   6   0
S2  1   6   4   5   16  3   4   6   6   0
S3  1   3   4   3   4   7   3   5   16  9
S4  0   0   4   5   6   0   0   4   5   6

아이디어는 col7, col2으로 나누는 col8것 입니다 col3.col11col11

예상 출력

S1  0.75    0.5 0.5 0.545455    0
S2  0.75    0.4 0.6 0.545455    0
S3  0.875   0.5 0.555556    0.842105    0.692308
S4  0  0  0.5  0.5  0.5

awk 스크립트

cat TestFile  | awk '{ out=$1; for(i=2;i<=6;i++) out=out"\t"$(i+5)/($i+$(i+5)); print out }'

명령 출력

S1  0.75    0.5 0.5 0.545455    0
S2  0.75    0.4 0.6 0.545455    0
S3  0.875   0.5 0.555556    0.842105    0.692308
awk: cmd. line:1: (FILENAME=- FNR=4) fatal: division by zero attempted

"0"으로 나누면 오류가 발생합니다.

0으로 나누었을 때 오류 보고 없이 "0"을 채우는 방법.

답변1

 awk '{for (i=2;i<=6;i++) $i = ($(i+5)!=0? $(i+5)/($i+$(i+5)): 0); NF=6} 1' file

우리는조건식, 나누기 전에 제수를 테스트하고, 0이면 나누지 않고 값을 할당하고 오류를 발생시킵니다. 또한 처음 6개 컬럼만 인쇄할 경우에도 NF=6레코드를 할당하여 인쇄하면 충분합니다.


Tab의도한 출력을 정렬하려면 출력 필드 구분 기호 정의를 사용 하거나 공백이 채워진 탭 모양 awk -v OFS='\t'으로 출력을 파이프할 수 있습니다 .colun -t

S1  0.75   0.5  0.5       0.545455  0
S2  0.75   0.4  0.6       0.545455  0
S3  0.875  0.5  0.555556  0.842105  0.692308
S4  0      0    0.5       0.5       0.5

관련 정보