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,