8

fort.1、fort.2 ... fort.500 という名前のファイルが 500 個あります。各ファイルには、次のように 800 個のデータが含まれています。

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
10 0.489

すべてのファイルから 2 列目の各行の平均を取得したいと考えています。つまり、すべてのファイルから 2 列目の 1 行目の平均を取得し、「output.file」に格納します。次に、2 行目の 2 列目の平均を取得し、同じ「output.file」に格納します。貼り付けコマンドを試しましたが、必要なものを取得できませんでした。AWKで何か方法はありますか?

どんな助けにも感謝します。ありがとう

4

4 に答える 4

8

最初の列に何も仮定せずにawk:

awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.*
于 2012-11-07T06:26:12.580 に答える
5

pasteとを使用する簡単な方法を次に示しawkます。

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

他のいくつかの回答と同様に; これは別の方法ですが、これはsort数値的にソートされた出力を取得するために使用します。

awk '{ sum[$1]+=$2; cnt[$1]++ } END { for (i in sum) print i, sum[i]/cnt[i] | "sort -n" }' fort.*
于 2012-11-07T06:19:49.653 に答える
3

最初の列が ID であると仮定します。

cat fort.* | awk '{sum[$1] += $2; counts[$1]++;} END {for (i in sum) print i, sum[i]/counts[i];}' 
于 2012-11-07T06:10:19.103 に答える
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
}
'

まず、配列を初期化して、すべてのファイルの行の合計を格納します。

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

最後に、配列をループして、すべてのファイルの平均値を行ごとに出力します。

于 2012-11-07T06:06:39.423 に答える