2012-03-20 12 views
3

私は、テキストファイルに格納された行列のセットを持っています。私は、入力行列の要素ごとの平均の結果である出力行列を計算したいと思います。図は以下の通りである:入力行列の値のいくつかはengineering notationにあること行列からの要素ごとの平均を計算する

cat file1.txt 
Item0 Item1 
Item0 1.01456e+06 5 
Item1 2 12.2 


cat file2.txt 
Item0 Item1 
Item0 1.0274e+06 6 
Item1 0 14.5 


cat output.txt 
Item0 Item1 
Item0 1020980 5.5 
Item1 1 13.35 

注意。 すべての提案が歓迎されています!

答えて

3
awk -v row=2:3 -v col=2:3 -v num=2 ' 

BEGIN { 
    split(row, r, ":") 
    split(col, c, ":") 
    n = num 
} 

r[1]<=FNR && FNR<=r[2] { 
    for(i=c[1];i<=c[2];i++) 
    { 
     m[FNR,i]+=$i 
    } 
} 

END { 
    for(i=r[1];i<=r[2];i++) 
    { 
     for(j=c[1];j<=c[2];j++) 
     { 
      printf("%f\t", m[i,j]/n) 
     } 
     print "" 
    } 
}' file{1,2}.txt 

1020980.000000 5.500000 
1.000000  13.350000 
2

私はこれを2段階で行うことをお勧めします。まず、行列を(行番号、列番号、値)の三つ組の行に変換します。簡単にするために、行と列のラベルのない行列を仮定します。

for f in file*.txt 
do 
    awk '{ for (n=1; n<=NF; n++) { print NR, n, $n } }' $f 
done 

この最初の手順は、すべての行列をより簡単に処理できる方法でまとめてスローします。

次に、awkのにトリプルをパイプで平均値を計算します。簡単にするために

awk -v Rows=2 -v Cols=2 Mats=2 ' 
{ 
    sum[$1, $2] += $3 
} 

END { 
    for (m=1; m<=Rows; m++) { 
    for (n=1; n<=Cols; n++) { 
     printf("%s ", sum[m, n]) 
    } 
    printf("\n") 
    } 
}' 

を、私はawkの変数として行、列、および行列の数で渡さきました。代わりに、トリプルからそれらを決定することができます。

関連する問題