![使用 awk 将文件每一行中的数字除以该文件中的最大值](https://linux22.com/image/103919/%E4%BD%BF%E7%94%A8%20awk%20%E5%B0%86%E6%96%87%E4%BB%B6%E6%AF%8F%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%9A%84%E6%95%B0%E5%AD%97%E9%99%A4%E4%BB%A5%E8%AF%A5%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9C%80%E5%A4%A7%E5%80%BC.png)
我有一个这样的文件:
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
这是您的命令失败的地方。
更好的方法:不要遍历临时文件,而是将最大值存储在变量中,例如拘萨罗南达的回答。