![awk를 사용하여 500개의 파일을 한 번에 구문 분석하여 파일 값의 표준 편차를 찾으려면 어떻게 해야 합니까?](https://linux55.com/image/194406/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20500%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%95%9C%20%EB%B2%88%EC%97%90%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EA%B0%92%EC%9D%98%20%ED%91%9C%EC%A4%80%20%ED%8E%B8%EC%B0%A8%EB%A5%BC%20%EC%B0%BE%EC%9C%BC%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
500개의 파일이 있고 각 파일에는 값 열이 있으며 표준 편차를 찾아야 합니다. 나는 이것을 많이 알아 냈습니다.
awk '{sum+=$5; array[NR]=$5} END {for(x=1;x<=NR;x++){sumsq+=((array[x]-(sum/NR))**2);}print sqrt(sumsq/NR)}' SL9_700.00001.bt
하지만 모든 SL9_700.0* 파일에 대해 이것을 한 번에 복제하는 방법을 모르겠습니다.
답변1
스크립트가 1개 파일에 대해 원하는 작업을 수행하는 경우 ENDFILE에 대해 GNU awk를 사용하면 END 대신 ENDFILE을 사용하고 NR 대신 FNR을 사용하고 각 파일에 대해 변수를 사용한 후 반복할 수 있습니다. 변수 설정:
awk '{sum+=$5; array[FNR]=$5} ENDFILE {for(x=1;x<=FNR;x++){sumsq+=((array[x]-(sum/FNR))**2);}print sqrt(sumsq/FNR); sum=sumsq=0}' SL9_700.0*
또는 더 명확하게:
awk '
{
sum += $5
array[FNR] = $5
}
ENDFILE {
for (x = 1; x <= FNR; x++) {
sumsq += ((array[x] - (sum / FNR)) ^ 2)
}
print sqrt(sumsq / FNR)
sum = sumsq = 0
}
' SL9_700.0*
ENDFILE 섹션에 FNR 0에 대한 테스트를 추가하고 이 경우 빈 입력 파일에 대한 0으로 나누기 오류를 피하기 위해 작업을 수행할 수 있습니다(원본 스크립트의 END 섹션에 있는 NR에도 동일하게 적용됨). , 예를 들어:
awk '
{
sum += $5
array[FNR] = $5
}
ENDFILE {
if ( FNR == 0 ) {
print 0
}
else {
for (x = 1; x <= FNR; x++) {
sumsq += ((array[x] - (sum / FNR)) ^ 2)
}
print sqrt(sumsq / FNR)
sum = sumsq = 0
}
}
' SL9_700.0*
각 출력 값 앞에 파일 이름을 인쇄하려면 각각을 print
다음으로 변경하십시오.print FILENAME,