使用awk计算数字的平均值

时间:2016-03-21 23:44:01

标签: linux bash math awk putty

我有一个名为test.txt的文件,其中包含以下内容:

10
200
3000
=======
4
5
=======

我需要编写一个awk脚本来将此文件中的文本作为awk脚本和输出的输入:

10
200
3000

Average 1070.00

4
5

Average 4.50

我这样写了我的剧本:

{while($1!~"=======") s+=$1;}
{print "Average ", s}

每次运行此代码时,我都会使用:

awk -f awrp4 test.txt

但它崩溃了。我不知道自己做错了什么。我是一名初学者并且正在尝试了解awk功能,所以如果这看起来相当简单,我会道歉。欢迎任何帮助。

3 个答案:

答案 0 :(得分:2)

使用GNU awk,你可以写:

gawk '
    BEGIN {FS = "\n"; RS = "\n=+\n"}
    NF > 0 {
        sum = 0
        for (i=1; i<=NF; i++) {
            print $i
            sum += $i
        }
        printf "Average %.2f\n", sum/NF
    }
' file

答案 1 :(得分:1)

格伦的解决方案当然没有错,但对你来说可能有点先进。也许这更适合:

{
if ($1 == "=======") {
    print "\nAverage " s/i "\n";
    s=0;
    i=0;
} else {
    print $1;
    s += $1;
    i += 1;
}
}

正如我在评论中提到的,awk的本质是循环遍历文本文件的每一行。除非您正在进行一些后期处理或使用数组,否则while循环可能没什么用处。

答案 2 :(得分:0)

awk '$1~/^[[:digit:]]/ {i++; sum+=$1; print $1} $1!~/[[:digit:]]/ {print "Average", sum/i; sum=0;i=0}' file
  • 第一部分检查第1列中的第一个字符是否为数字,如果是,则递增计数器&#39; i&#39;并将该记录(数字)添加到总和。
  • 第二部分是跳过任何不以数字开头的记录,然后通过除以sum / i打印平均值,最后重置计数器和总和为0.