Shell脚本将每行作为总计的一部分

时间:2014-12-24 16:01:53

标签: shell unix

我有一个看起来像的文件:

381932
148457
304268
254699

我想编写一个shell脚本,它将每行返回为总数的一部分:

0.350603476
0.1362796
0.279309978
0.233806946

如何在shell脚本中使用?

3 个答案:

答案 0 :(得分:1)

使用&

#!/bin/bash

total=$(echo $(<file) | tr ' ' '+' | bc)
while read num; do echo "scale=9;$num/$total" | bc; done < file

答案 1 :(得分:1)

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

答案 2 :(得分:1)

参考this question

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

这具有更高的内存要求,值得注意的是,如果您的文件非常大。