【问题标题】:bash getting numbers from a file and make the average of thembash 从文件中获取数字并取它们的平均值
【发布时间】:2018-07-06 04:38:27
【问题描述】:

编写一个期望文件作为其第一个参数的脚本。的一些行 文件将由整数 0 - 1000 组成。 脚本应该选择符合先前条件的行并将它们的平均值打印到标准输出(n 个整数的平均值是它们的总和除以 n)。

给出的文件如下所示:

22
78907
77 88 99 0000
need 11 gallons of water
0
roses are red
11

示例输出:

11

解释:(22 + 11 + 0) / 3 = 11

我已经尝试过使用此代码:

#!/bin/bash

sum=0
ind=0

while IFS='' read -r line || [[ -n "$line" ]]; do
   if [[ $line =~ ^[a-zA-Z\ ]+$ ]]
   then
        ${sum}=${sum}+${#line} 
        ${ind}=${ind}+1 
        echo ${sum}
   fi        
done < "$1"

value=${sum}/${ind}
echo ${value}

此代码的打印始终为 0/0 和一些错误,例如:

./test1: line 9: 0=0+13: command not found
./test1: line 10: 0=0+1: command not found

有什么想法吗?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    您的脚本的部分问题已得到答复here.. 您的变量分配不正确。您只使用$引用 已分配的变量。赋值过程去掉了美元符号。

    您遇到的另一个问题是您的算术没有在arithmetic expression 中表达。

    请注意,您可以使用 arithmetic expansion 来处理您的变量:

      if [[ $line =~ ^[a-zA-Z\ ]+$ ]]; then
          (( sum += ${#line} ))
          (( ind++ ))
          printf '%s\n' "$sum"
      fi
    

    以后...

    value="$(( sum / ind ))"
    printf '%s\n' "$value"
    

    注意 bash 只能处理整数数学,浮点数会被截断。对于更高级的数学,考虑使用 bcdc(它们不是 bash 内置的,它们是可能需要安装在您的系统上的单独工具)或其他语言,如 awkperl用更好的性能和更精确的数学来做同样的事情。

    也就是说,如果你真的需要的话,你可以通过几行额外的代码和字符串操作来“伪造”几个小数位:

    $ sum=100; ind=7
    $ printf -v x '%d' "$((${sum}00/${ind}))"
    $ printf '%d.%d\n' "${x%??}" "${x:$((${#x}-2))}"
    14.28
    

    第一个 printf 有除法,将被除数乘以 100(在其后添加两个零)。然后将所得商与第二个 printf 分开以插入小数点。这是一个黑客。使用支持真实数学的工具。

    【讨论】:

    • 嘿,我照你说的做了,但实际上我修改了那个 if 语句中的正则表达式,所以现在看起来像 ^([1000|[0-9]'\n'*[0-9]{0,2}'\n') 之后我放了 +$ 但是我不确定这个是做什么的,我是 bash 的新手 :D 哦,我忘了,现在我收到了这个错误:./test1: line 23: sum / ind : division by 0 (error token is "ind ")
    • @DanutChirila,如果你想编写和测试正则表达式,regex101.com 是一个很好的资源。你想用你的正则表达式匹配什么?这似乎暗示“一个数字或 1000,后跟零个或多个换行符,后跟最多两位数字和另一个换行符”.. 但请注意,正如您在上面编写的示例一样,\n 不会扩展为换行符。此外,$line 永远不会包含换行符,因为它会逐行读取输入
    • 如上所述,我尝试仅获取数字在 0-1000 之间的行并使其平均值...
    • 好的,但这不是正则表达式所识别的。在我提供的链接上对其进行测试,并考虑使用算术评估来检查数值而不是正则表达式。有正则表达式的地方,但verifying numeric values probably can be done better in other ways.
    • 所以你说我必须找到另一种方法来只从文件中获取数字......
    猜你喜欢
    • 2020-06-15
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多