여러 파일의 평균 및 표준 편차

여러 파일의 평균 및 표준 편차

3000개의 파일(1.out, 2.out, 3.out...)이 있고 각 파일에는 다음과 같은 열이 있습니다.

0.446477
0.439331
0.444394
0.425003
0.428981
0.419547
0.432834
0.417874
........

3000개 파일의 각 행에 대한 평균과 표준편차를 계산해야 합니다. 다음을 사용하여 평균을 계산할 수 있습니다.

awk '{a[FNR]+=$1;b[FNR]++;}END{for(i=1;i<=FNR;i++)print a[i]/b[i];}' *.out

하지만 표준편차를 계산하는 데 막혔습니다.

답변1

복잡한 솔루션 사용법반죽명령과데이터 혼합도구:

  1. 추가 처리를 위해 모든 파일을 하나의 파일로 결합합니다.

    paste [0-9]*.out | datamash transpose > data
    

    -- datamash transpose- 행을 열로 바꿉니다.

  2. 총 필드 수를 가져옵니다.

    nf=`awk '{print NF; exit}' data`
    
  3. 평균과 표준편차를 계산합니다.

    for ((i=1; i<$nf; i++)); do datamash mean $i pstdev $i < data; done 
    

출력은 다음과 같습니다(첫 번째 열 - 평균, 두 번째 열 - 표준 편차 값).

0.596477    0.11180339887499
0.589331    0.11180339887499
0.594394    0.11180339887499
0.575003    0.11180339887499
0.578981    0.11180339887499
0.569547    0.11180339887499
0.582834    0.11180339887499
.......

답변2

표준편차를 한 번에 계산할 수 있습니다.스크립트를 너무 많이 수정할 필요가 없습니다.

awk '{a[FNR]+=$1; b[FNR]++; c[FNR]+=$1*$1 } 
     END{
        for(i=1;i<=FNR;i++)
          print a[i]/b[i], sqrt((c[i]-a[i]*a[i]/b[i])/(b[i]-1)) ;
     }
' *.out

이것은어린애 같은구현, 또 다른 구현, 동일한 위키 페이지의 "온라인 방법":

awk '{
  x=$1
  n[FNR] += 1
  delta = x - mean[FNR]
  mean[FNR] += delta/n[FNR]
  delta2 = x - mean[FNR]
  M2[FNR] += delta * delta2
}
END{
for(i=1;i<=FNR;i++)
        if(n[i]<2)
                print mean[i], 0
        else
                print mean[i], sqrt(M2[i]/(n[i]-1))
}' *.out

관련 정보