【问题标题】:Sum/Average numbers in a single line - UNIX单行中的总和/平均数 - UNIX
【发布时间】:2016-03-23 14:28:37
【问题描述】:

我正在编写一个小脚本,将 3 个数字放在一行中,对它们求和并求平均值,然后在行尾打印结果。我知道如何使用粘贴命令,但我发现的一切都在告诉我如何平均一列。我需要平均一条线,而不是一列。有什么建议吗?谢谢!

【问题讨论】:

  • 任何样本输入?
  • 不就是 ($1 + $2 + $3)/3 吗?

标签: bash shell unix scripting


【解决方案1】:

awk 来救援!

$ echo 1 2 3 | awk -v RS=' ' '{sum+=$1; count++} END{print sum, sum/count}'
6 2

适用于任意数量的输入字段

$ echo 1 2 3 4 | awk -v RS=' ' '{sum+=$1; count++} END{print sum, sum/count}'
10 2.5

【讨论】:

  • 或 Perl:echo "1 2 3" | perl -pae '$_=eval(join"+",@F)/@F'
  • @andlrc 无需在 cmets 中将答案翻译成另一种语言。如果您觉得perl 解决方案更好,请将其发布为答案。
【解决方案2】:

您可以在将线路交给bc 之前对其进行操作。使用bc,您还有其他可能性,例如设置比例。 1 2 3 的简单平均值是

   echo "1 2 3"  | sed -e 's/\([0-9.]\) /\1+/g' -e 's/.*/(&)\/3/' | bc

您可以将其包装在一个函数中并查看更多可能性:

function testit {

   echo "Input $@"
   echo "Integer mean"
   echo "$@"  | sed -e 's/\([0-9.]\) /\1+/g' -e 's/.*/(&)\/'$#'/' | bc

   echo "floating decimal mean"
   echo "$@"  | sed -e 's/\([0-9.]\) /\1+/g' -e 's/.*/(&)\/'$#'/' | bc -l

   echo "2 decimal output mean"
   echo "$@"  | sed -e 's/\([0-9.]\) /\1+/g' -e 's/.*/scale=2; (&)\/'$#'/' | bc
   echo
}

testit 4 5 6
testit 4 5 8
testit 4.2 5.3 6.4
testit 1 2 3 4 5 6 7 8 9

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多