【问题标题】:Scripts for computing the average of a list of numbers in a data file用于计算数据文件中数字列表平均值的脚本
【发布时间】:2013-03-18 20:54:08
【问题描述】:

文件data.txt 包含以下内容:

1.00 1.23 54.4 213.2 3.4

脚本的输出应该是:

ave: 54.646

一些简单的脚本是首选。

【问题讨论】:

  • 多行怎么办?
  • awk '{s+=$1}END{print "ave:",s/NR}' RS="\n" file #如果你每行有一条记录
  • 默认记录分隔符 (RS) 为 \n,因此如果您有多行,则无需指定 RS="\n"。 awk '{s+=$1}END{print "ave:",s/NR}' file

标签: bash sed awk


【解决方案1】:

这是一种方法:

$ awk '{s+=$1}END{print "ave:",s/NR}' RS=" " file
ave: 54.646

【讨论】:

  • 这将在空文件上产生除以零错误。你需要类似awk '{s+=$1}END{print "ave:",(NR?s/NR:"NaN")}' RS=" " file
【解决方案2】:

另一种选择是使用jq

$ seq 100|jq -s add/length
50.5

-s (--slurp) 在将每一行解析为 JSON 或在本例中为数字后为输入行创建一个数组。

或者在 OP 的情况下:

tr \  \\n<file|jq -s add/length|sed s/^/ave:\ /

【讨论】:

  • 可能是我见过的最有创意的使用jq的方法之一!
  • 这样的好处是可以在使用 jq 过滤掉必要的数字后使用,例如:` jq -r '.SpotPriceHistory[].SpotPrice' | jq -s 添加/长度`
  • 仅供参考,如果你平均很多数字。这绝对比 awk 方法慢。我懒得对其进行基准测试,但对于 1400 万个整数,awk 几乎立即返回,而jq 方法需要一段时间......
  • @WattsInABox 我尝试运行time seq 1000000|awk '{x+=$0}END{print x}' &gt;/dev/null,它需要0.14秒,但jq -s add/length需要0.70秒。
  • 是的,虽然这非常简洁,虽然它没有那么慢,但这确实很慢,只适合处理非常小的数据集。
【解决方案3】:
perl -lane '$a+=$_ for(@F);print "ave: ".$a/scalar(@F)' file

如果您有多行并且只需要一个平均值:

perl -lane '$a+=$_ for(@F);$f+=scalar(@F);END{print "ave: ".$a/$f}' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2023-03-29
    相关资源
    最近更新 更多