Awk

使用 awk 將文件每一行中的數字除以該文件中的最大值

  • January 24, 2017

我有一個這樣的文件:

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

我不知道如何解決它。誰能幫我?

讓我們假設對文件內容進行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

因此,您唯一缺少的是將最大值正確儲存在變數中。

這是一個一次性的 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
}

引用自:https://unix.stackexchange.com/questions/339781