【发布时间】:2015-02-22 17:19:42
【问题描述】:
我有一个看起来像这样的文件:
381932
148457
304268
254699
我想编写一个 shell 脚本,将每一行作为总数的一部分返回:
0.350603476
0.1362796
0.279309978
0.233806946
如何在 shell 脚本中执行此操作?
【问题讨论】:
-
你在说什么shell?你试过什么?
我有一个看起来像这样的文件:
381932
148457
304268
254699
我想编写一个 shell 脚本,将每一行作为总数的一部分返回:
0.350603476
0.1362796
0.279309978
0.233806946
如何在 shell 脚本中执行此操作?
【问题讨论】:
sum=$(perl -nle '$sum += $_ } END { print $sum' file)
awk -v "sum=$sum" '{print $1/sum}' file
0.350603
0.13628
0.27931
0.233807
该问题需要 2 次遍历文件:一次计算总和,一次打印分数。
另一种方法是在求和时存储行:
awk '{sum += $1; n[NR]=$1} END {for (i=1; i<=NR; i++) print n[i]/sum}' file
这有更高的内存要求,如果您的文件非常大,请注意。
【讨论】:
awk 可能会有所帮助:
awk '{s+=$1;a[NR]=$1}END{for(i=1;i<=NR;i++)printf "%.9f\n", a[i]/s}' file
输出:
0.350603476
0.136279600
0.279309978
0.233806946
【讨论】: