패턴 옆 숫자의 표준편차

패턴 옆 숫자의 표준편차

태그가 많은 파일이 있는데 태그 옆에 다음과 같은 숫자가 있습니다.

<Score>4
... other data
<Score>2
... other data
<Score>3

등...

grep을 사용하여 한 줄에서 발생 횟수를 얻습니다.

grep -c '<Score>' $1

awk를 사용하여 분수의 합을 계산했습니다.

awk 'sub(/<Score>/,""){y+=$0} END{print y}' $1}

그런 다음 grep에서 얻은 숫자로 나누어 평균을 구합니다.

제가 고민하고 있는 것은 <Score> 옆에 있는 각 값의 평균을 구하고 제곱한 다음 이를 더하는 방법입니다.

평균은 변수 $mean에 저장됩니다. 제가 시도한 코드는 다음과 같습니다.

awk 'sub(/<Score>/,""){y+=($0-$mean)^2} END{print y}' $1

그러나 계속 0을 출력합니다. 이것을 변수에 저장할 수 있다면 다른 모든 변수를 사용하여 표준 편차를 계산할 수 있습니다.

답변1

다음은 사용할 수 있는 몇 가지 유틸리티입니다. 첫 번째는 주어진 숫자의 평균을 계산합니다(행당 하나의 숫자). 두 번째는 첫 번째를 사용하여 파일에 있는 숫자의 표준 편차를 계산합니다.


실행 가능 파일 average:

#!/usr/bin/awk -f

/^[0-9.+-]/     { sum += $0; ++n }

END             { print sum / n }

스크립트 awk는 파일이나 표준 입력에서 입력을 읽고 그 안에 있는 숫자의 평균을 계산합니다. 한 줄에 하나의 숫자가 필요합니다.


실행 가능 파일 stdev:

#!/bin/sh

awk -v avg="$( ./average "$1" )" \
    '/^[0-9.+-]/ { sum += ($0 - avg)^2; ++n }
     END         { print sqrt(sum / (n - 1)) }' "$1"

이 쉘 스크립트는 먼저 위 average스크립트를 사용하여 명령줄에 제공된 파일의 데이터 평균을 계산합니다. 번호는 awk변수 에 할당됩니다 avg. 그런 다음 스크립트와 동일한 유형의 숫자 ​​감지를 사용하여 average표준 편차를 계산합니다.

이 스크립트는 현재 작성 중이므로 표준 입력이 아닌 파일의 데이터가 필요합니다.


데이터에 사용하는 한 가지 방법:

sed -n '/^<Score>/s///p' input.dat >output.dat

output.dat주어진 데이터를 사용하여 다음 내용으로 호출되는 파일을 생성합니다 .

4
2
3

stdev이 파일에 위 스크립트를 사용하십시오.

$ ./stdev output.dat
1

제가 아는 한, 이것이 맞습니다.


물론 awk재사용 가능한 도구를 구축하지 않고도 단일 호출로 이 작업을 직접 수행할 수도 있습니다.

awk -F '>' '/^<Score>/ { v[++n] = $2; s += $2 }
            END { avg = s/n;
                  for (i=1; i<=n; ++i) {
                      std += (v[i] - avg)^2;
                  }
                  print sqrt(std / (n - 1));
                 }' input.dat

관련 정보