awk를 사용하여 500개의 파일을 한 번에 구문 분석하여 파일 값의 표준 편차를 찾으려면 어떻게 해야 합니까?

awk를 사용하여 500개의 파일을 한 번에 구문 분석하여 파일 값의 표준 편차를 찾으려면 어떻게 해야 합니까?

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,

관련 정보