次のファイルがあります。
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
ここでコマンドは失敗します。
より良い方法:一時ファイルを繰り返すのではなく、次の変数に最大値を保存します。コサロナンダの答え。