2012-11-07 26 views
7

名前はfort.1、fort.2 ... fort.500の500ファイルがあります。複数のファイルからawkを使って平均を計算する

1 0.485
2 0.028
3 0.100
4 0.979
5 0.338
6 0.891
7 0.415
8 0.368
9 0.245
:各ファイルは、以下のように800件のデータが含まれています10 0.489

すべてのファイルから2番目の列の各行の平均を取得したい。言い換えると、すべてのファイルから2行目の1行目の平均値を取得し、「output.file」に格納します。次に、2番目の行の2番目の列の平均を取得し、同じ "output.file"に格納します。 貼り付けコマンドを試しましたが、私が望むものを得ることができません。 AWKで実行する方法はありますか?

ありがとうございました。 ありがとう

答えて

1

私の理解:各ファイルは特定の場所での測定値です。すべての場所に測定値を集約し、各ファイルの同じ行の値を平均して新しいファイルにしたいとします。

最初の列は、行のIDとして扱うことができる(800回の測定がファイルに存在する)と仮定すると:

cat fort.* | awk ' 
BEGIN { 
    for (i = 1; i <= 800; i++) 
     total[i] = 0 
} 

{ total[$1] += $2 } 

END { 
    for (i = 1; i <= 800; i++) 
     print i, total[i]/500 
} 
' 

まず、我々はすべてにわたって行の和を格納するための配列を初期化ファイル。

次に、連結されたファイルをループします。最初の列を行のキーとして使用し、配列に合計します。

最後に、配列全体をループして、すべてのファイルにわたって平均値を行単位で出力します。最初の列を想定し

+0

私が理解は、最初はすべての値から、ということですfort.1ファイルは配列 "total"で保持されます。次に、2番目のファイルfort.2を読み込み、配列の合計を保持します。 (例えば、)、平均を得るために、第1ファイルと第2ファイルのそれぞれから行う(合計[1] +合計[1]/2)。しかし、私はこれを取得しない...申し訳ありませんが、私は間違って理解しています。 – Vijay

+0

問題の周りの私の前提を反映するように編集されました。 –

+0

ご返信ありがとうございます。私が欲しいものをもう一度明らかにする。各ファイル(合計500ファイル)には2列(第1列と第2列)と800行の行が含まれています。最初の行、各ファイル(すべての500ファイル)の2番目の列を追加して平均を計算し、newfileにaverage.outputとして保存します。次に、すべてのファイル(500ファイル)の2行目、2列目に移動し、平均値と平均値を計算します。出力。 average.outputファイルに800行が含まれるまで続けます。あなたはこの説明を欲しいと願っています。私の質問が投稿の中であなたを混乱させたら申し訳ありません。前もって感謝します。 – Vijay

2

はIDです:

cat fort.* | awk '{sum[$1] += $2; counts[$1]++;} END {for (i in sum) print i, sum[i]/counts[i];}' 
5

はここpasteawkを使用して簡単な方法です。他の回答の一部のように

paste fort.* | awk '{ for(i=2;i<=NF;i+=2) array[$1]+=$i; if (i = NF) print $1, array[$1]/NF*2 }' > output.file 

。ここでもう一つの方法ですが、この1は数値的にソートされた出力を得るためにsortを使用しています。第一列上の任意の仮定なし

awk '{ sum[$1]+=$2; cnt[$1]++ } END { for (i in sum) print i, sum[i]/cnt[i] | "sort -n" }' fort.* 
7

のawk:このコードで

awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.* 
+0

このコードでは、すべての入力ファイル(fort.1、fort.2 ...)のすべての行を考慮して平均を計算し、その後すべてのファイル(fort.1、fort.2 ...)の2行目に移動しますか? 。)各ファイルから800行まで?私はこのコードが実際に何をするのか理解するために何らかの説明が必要です。ありがとうございました – Vijay

+0

@ Vijay:確かにそれは砦に更新されました*。あなたは小さなサンプルファイルに対してそれをテストすることができます... – Guru

+0

Guru、このコードは正常に動作します。ありがとうございました。さらに小さなものを追加する必要があります。私はfort.1、fort.2という名前のファイルを持っています。私は城砦を置くのが怖い。*、それはfort.1、fort.10、fort.1、fort.1、fort.1の代わりにfort.1を読む。どのようにこれを扱うことができますか?ありがとう – Vijay

関連する問題