Bash 脚本,从文件中读取

Bash Scripting, Reading From A File

我正在尝试从我的 .txt 文件中 select 以 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 ; }')
       do 
          total=$(echo $total+$i  )
          var=$((var+1))
       done
  fi
       echo "scale=2; $total / $count"  
       echo $line
  done < $file
}

F1

my output

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

total=$(echo $total+$i  )

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

total=0+4711

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

((total = total + i))

如果您无论如何都在使用 Awk,请使用它的功能。

awk '/^F/ { sum+=; 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 上,尽量减少您的问题,使其真正只问一个问题。所有这些问题都有重复的问题,但我只是将其标记为与您实际询问的问题重复。