awk を使用して、ファイルの各行の数値をそのファイルの最大値で除算します。

awk を使用して、ファイルの各行の数値をそのファイルの最大値で除算します。

次のファイルがあります。

0.0451660231
0.0451660231
0.0527343825
0.3933106065
0.3970947862
0.0489502028
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.4008789659
0.1397705227

各行を最大値に分割したいと思います。

私がやった

cut -f1 -d"," CVBR1_hist | sort -n | tail -1 > maximum
awk -v c=$maximum '{print $1/c}' CVBR1_hist > CVBR1_norm

このエラーがあります。

awk: cmd. line:1: (FILENAME=CVBR1_hist FNR=1) fatal: division by zero attempted

どのように解決すべきかわかりません。誰が私を助けることができますか?

答え1

CVBR1_histファイルの内容を数値で並べ替えると、正しいデータが生成されると想定されます。

$ sort -n CVBR1_hist
0.0451660231
0.0451660231
0.0489502028
0.0527343825
0.1397705227
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.3933106065
0.3970947862
0.4008789659

その後、次のコマンド置換を使用して変数に最大値を格納できます。

maximum="$( sort -n CVBR1_hist | tail -n 1 )"

正規化された値は次のように取得できますawk

awk -v m="$maximum" '{ print $1/m }' CVBR1_hist >CVBR1_norm

したがって、欠けている唯一のことは、変数に最大値を正しく保存することです。

答え2

これはワンタイムawkソリューションですが、メモリ内のすべてのデータを配列に保存します。次のように実行します。awk -f thisprogram.awk < CVBR1_hist > CVBR1_norm

{
  elements[NR]=$1
  if ($1 > largest) {
    largest = $1
  }
}
END {
  for(i=1; i <= NR; i++)
    printf "%.10f\n", elements[i]/largest
}

答え3

awk では、変数「c」が空の変数と同じに設定されているため、エラーが発生します。 $maximumがまだ設定されていません。

あなたがしなければならないこと:

awk -v c=`cat maximum` '{print $1/c}' CVBR1_hist > CVBR1_norm

ここでコマンドは失敗します。

より良い方法:一時ファイルを繰り返すのではなく、次の変数に最大値を保存します。コサロナンダの答え

関連情報