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,