태그가 많은 파일이 있는데 태그 옆에 다음과 같은 숫자가 있습니다.
<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