2016-07-31 6 views
1

awkスクリプト、または何でもできることを助けてくれてありがとう。AWK(または何か他のもの)複数のファイルからの複数の列の平均

私は複数のファイル(行と列の同じ量)を持っており、すべてのファイルからすべての列(最初の列を除く)のすべての数値を平均したいと考えています。私はファイルにいくつの列があるのか​​分かりませんが(必要であればおそらく番号を取得できます)。私はここに、単一の列にそれをしないように、このどこかを見つけた

1 2 3 5 5 
2 4 5 6 7 
3 3 4 6 7 

filename.1

1 1 2 3 4 
2 3 4 5 6 
3 2 3 5 6 

filename.2

1 3 4 6 6 
2 5 6 7 8 
3 4 5 7 8 

出力(限り私が理解しているように

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

だから唯一の?変更は+ = $ 2をすべての列のサイクルに置き換えることでしょうか?列の正確な数を知らなくてもそれを行う方法はありますか?

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

答えて

4
$ cat tst.awk 
{ 
    key[FNR] = $1 
    for (colNr=2; colNr<=NF; colNr++) { 
     sum[FNR,colNr] += $colNr 
    } 
} 
END { 
    for (rowNr=1; rowNr<=FNR; rowNr++) { 
     printf "%s%s", key[rowNr], OFS 
     for (colNr=2; colNr<=NF; colNr++) { 
      printf "%s%s", int(sum[rowNr,colNr]/ARGIND+0.5), (colNr<NF ? OFS : ORS) 
     } 
    } 
} 

$ awk -f tst.awk file1 file2 
1 2 3 5 5 
2 4 5 6 7 
3 3 4 6 7 

の数は、他awksがちょうど開始時行FNR==1{ARGIND++}を追加すると、ARGINDためGNU AWKを使用しています。

+1

ありがとう、これはトリックです。 –

+0

ハ、私はfile.2で間違いを発見したので、これは実際に提供された例のために実際に動作して驚いています。それを修正した後、sum [rowNr、colNr]/ARGINDを使うだけで、実数に対して正しい結果が得られます。乾杯。 –

0

a[FNR]+=$2

for(i=2;i<=NF;i++) { a[FNR] += $i; } 

NF

によってを交換は、上記のフィールド

関連する問題