【问题标题】:Bash Scripting, Reading From A File [duplicate]Bash 脚本,从文件中读取 [重复]
【发布时间】:2021-05-16 01:22:49
【问题描述】:

我正在尝试从我的 .txt 文件中选择以 F 开头的行,然后找到数字的平均值,这是我的代码,我不知道为什么它没有加起来。

#!/bin/bash
function F1()
{
count=1;
total=0;
file='users.txt'
while read line; do
  if (grep \^"F");
   then
     for i in $( awk '{ print $3; }')
       do 
          total=$(echo $total+$i  )
          var=$((var+1))
       done
  fi
       echo "scale=2; $total / $count"  
       echo $line
  done < $file
}

F1

my output

【问题讨论】:

标签: linux bash git-bash integer-arithmetic


【解决方案1】:

如果您仍然在使用 Awk,请使用它的功能。

awk '/^F/ { sum+=$3; count++ } END { print (count ? sum/count : 0) }' users.txt

这是一个标准的 Awk 习语,通常是在任何慢节奏的初级 Awk 基础教程的第一个小时内进行练习,或者在更多定向学习的十分钟内进行练习。

您的 shell 脚本至少有以下错误;

  • grep 不带参数将一口气读入其余的输入行。在子 shell 中(即在括号内)运行它没有任何用处,并且会花费您一个进程。
  • shell 不执行任何算术运算,除非您单独请求它;变量只是字符串。如果您想将两个数字相加,您需要明确地使用像 ((total+=i)) 这样的算术评估......就像您已经在其他地方所做的那样。
  • read 没有任何选项会破坏您输入中的反冲;如果您没有特别要求这种行为,则应始终使用read -r
  • 除了其中一个分号之外的所有分号都是无用的。
  • 您通常应该引用所有变量;见When to wrap quotes around a shell variable
  • 如果您仍然使用 Awk,您应该尽可能多地使用它。在逐行处理文件时,shell 非常缓慢且效率低下,而在整数运算方面则非常笨拙(更不用说除以彼此甚至不是整数倍的数字了)。

这可能不完整;在寻求人工帮助之前,请尝试http://shellcheck.net/

在 Stack Overflow 上,尽量减少你的问题,让它真的只问一个问题。所有这些问题都有重复的问题,但我只是将其标记为与您实际询问的问题的重复。

【讨论】:

    【解决方案2】:

    您没有对变量total 执行加法。在第一次迭代中,行

    total=$(echo $total+$i  )
    

    (假设i,例如,是4711)被扩展为

    total=0+4711
    

    所以变量 total 设置为 6 个字符的字符串,而不是数字。要在此处实际添加,您必须编写

    ((total = total + i))
    

    【讨论】:

    • 我仍然有相同的输出,你认为这是唯一的问题吗?
    • 剧本中有很多奇怪之处,所以我只选择了最明显的一个。我建议您使用set -x 运行您的程序。您可能会从中发现所有错误。如果某项陈述的效果事后仍不清楚,请再次询问该特定陈述。
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2020-06-18
    • 2014-10-26
    • 2013-03-07
    • 1970-01-01
    相关资源
    最近更新 更多