2016-06-17 11 views
0

私はすべてのレコードをループできない理由を知りません。現在は最後のレコードになり、正規化が表示されます。AWKを使用した最小最大正規化

正規化式:

NEW_VALUE =(値 - 分[I])/ -

プログラム

{ 
    for(i = 1; i <= NF; i++) 
    { 
     if (min[i]==""){ min[i]=$i;}  #initialise min 
     if (max[i]==""){ max[i]=$i;}  #initialise max 
     if ($i<min[i]) { min[i]=$i;}  #new min 
     if ($i>max[i]) { max[i]=$i;}  #new max 
    } 

} 
END { 
    for(j = 1; j <= NF; j++) 
     { 
     normalized_value[j] = ($j - min[j])/(max[j] - min[j]); 
     print $j, normalized_value[j]; 
    } 
} 

(MAX [I] [I]分)データセット

4 14 24 34 
3 13 23 33 
1 11 21 31 
2 12 22 32 
5 15 25 35 

電流出力

5 1 
15 1 
25 1 
35 1 

要求出力

0.75 0.75 0.75 0.75 
0.50 0.50 0.50 0.50 
0.00 0.00 0.00 0.00 
0.25 0.25 0.25 0.25 
1.00 1.00 1.00 1.00 
+0

'END'ブロックの' $ j'は、データ・セット内の最後のレコードの 'j'番目のフィールドの値になりますt。 – jas

+0

まず、私はあなたの必要な出力を理解していません。これらの数字はどこから来ていますか?何の分?何の最大値?第二に、END句でNFを参照していますが、実際には意味がありません。 – Rumbleweed

+0

私はawkには本当に新しく、awk言語を理解するのに苦労しています。申し訳ありません。 minとmaxは、私が示したデータセットから計算され、各フィールドの最小値と最大値を計算し、最後にmin-maxアルゴリズムを使用して各フィールドを正規化します。 –

答えて

1

Iは、正規化された値を計算するために、一度、最小/最大値を決定するために、1回、2回をファイルを処理するであろう:

awk ' 
    NR==1 { 
     for (i=1; i<=NF; i++) { 
      min[i]=$i 
      max[i]=$i 
     } 
     next 
    } 
    NR==FNR { 
     for (i=1; i<=NF; i++) { 
      if  ($i < min[i]) {min[i]=$i} 
      else if ($i > max[i]) {max[i]=$i} 
     } 
     next 
    } 
    { 
     for (i=1; i<=NF; i++) printf "%.2f%s", ($i-min[i])/(max[i]-min[i]), FS 
     print "" 
    } 
' file file 
# ^^^^ ^^^^ same file twice! 

出力

0.75 0.75 0.75 0.75 
0.50 0.50 0.50 0.50 
0.00 0.00 0.00 0.00 
0.25 0.25 0.25 0.25 
1.00 1.00 1.00 1.00 
+0

ありがとう、私はついに理解しました。 –

+0

あなたは私の別の質問を見ることができますか? on awk。 http://stackoverflow.com/questions/37897154/one-nearest-neighbor-using-awk?noredirect=1#comment63248037_37897154こちらで援助が必要です –

関連する問題