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のテストを追加し、この場合、空の入力ファイルのゼロ除算エラーを回避するために作業を実行できます(元のスクリプトの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,

関連情報