【问题标题】:Shell script to get each line as fraction of totalShell脚本将每一行作为总数的一部分
【发布时间】:2015-02-22 17:19:42
【问题描述】:

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

381932
148457
304268
254699

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

0.350603476
0.1362796
0.279309978
0.233806946

如何在 shell 脚本中执行此操作?

【问题讨论】:

  • 你在说什么shell?你试过什么?

标签: shell unix


【解决方案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

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      使用 &

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

      【讨论】:

        猜你喜欢
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        相关资源
        最近更新 更多