3000 個のファイル (1.out、2.out、3.out...) があり、各ファイルには次の列があります。
0.446477
0.439331
0.444394
0.425003
0.428981
0.419547
0.432834
0.417874
........
3000ファイルの各行の平均と標準偏差を計算する必要があります。以下を使用して平均を計算できます。
awk '{a[FNR]+=$1;b[FNR]++;}END{for(i=1;i<=FNR;i++)print a[i]/b[i];}' *.out
しかし、標準偏差を計算するのをやめました。
答え1
複雑なソリューションの使い方生地コマンドとデータ混合ツール:
さらなる処理のために、すべてのファイルを1つのファイルに結合します。
paste [0-9]*.out | datamash transpose > data
--
datamash transpose
- 行を列に置き換えます。合計フィールド数を取得します。
nf=`awk '{print NF; exit}' data`
平均と標準偏差を計算します。
for ((i=1; i<$nf; i++)); do datamash mean $i pstdev $i < data; done
出力は次のとおりです(最初の列 - 平均、2番目の列 - 標準偏差値)。
0.596477 0.11180339887499
0.589331 0.11180339887499
0.594394 0.11180339887499
0.575003 0.11180339887499
0.578981 0.11180339887499
0.569547 0.11180339887499
0.582834 0.11180339887499
.......
答え2
標準偏差を一度に計算できます。スクリプトをあまり変更する必要はありません。
awk '{a[FNR]+=$1; b[FNR]++; c[FNR]+=$1*$1 }
END{
for(i=1;i<=FNR;i++)
print a[i]/b[i], sqrt((c[i]-a[i]*a[i]/b[i])/(b[i]-1)) ;
}
' *.out
これは子供のような実装、別の実装、同じWikiページの「オンライン方法」:
awk '{
x=$1
n[FNR] += 1
delta = x - mean[FNR]
mean[FNR] += delta/n[FNR]
delta2 = x - mean[FNR]
M2[FNR] += delta * delta2
}
END{
for(i=1;i<=FNR;i++)
if(n[i]<2)
print mean[i], 0
else
print mean[i], sqrt(M2[i]/(n[i]-1))
}' *.out