Bash(awk)-从数行中获取平均值

Bash(awk)-从数行中获取平均值,awk,Awk,我要做一个bash程序,它读取一个名字,存储它,然后读取分数,看看平均值是否在60以上。如果是,打印出他们的名字。所以文件看起来像这样 tim 50 60 70 roy 90 80 90 程序应该只打印“roy”,因为他是唯一一个成绩合格的人。这就是我得到的。我只是不知道该把这些东西放在哪里,比如;,{},and()所以我确信我的代码很糟糕: #!/bin/bash awk '{name=$i} {avg=0} { count=0; for(i=2;i<=NF;i++)

我要做一个bash程序,它读取一个名字,存储它,然后读取分数,看看平均值是否在60以上。如果是,打印出他们的名字。所以文件看起来像这样

tim 50 60 70
roy 90 80 90
程序应该只打印“roy”,因为他是唯一一个成绩合格的人。这就是我得到的。我只是不知道该把这些东西放在哪里,比如;,{},and()所以我确信我的代码很糟糕:

#!/bin/bash
awk '{name=$i}
{avg=0}
{
  count=0;
  for(i=2;i<=NF;i++)
    avg+=$i
  count++;
}
avg=avg/count {
  if(avg >= 60) 
    printf("%s ", name)
}'
#/bin/bash
awk'{name=$i}
{avg=0}
{
计数=0;
对于(i=2;i=60)
printf(“%s”,名称)
}'
令人惊讶的是,它编译时没有错误,但没有打印任何内容。

您就快到了:

awk '{
  name=$1
  tot=0
  for(i=2;i<=NF;i++)
    tot+=$i
  if(tot/(NF-1)>60)
    print name
  }' yourfile
awk'{
姓名=$1
tot=0
对于(i=2;i60)
印刷品名称
}“你的档案

这很有效!但有两个问题,为什么要放$NF和NF-1?这两条语句在做什么?$NF是一个错误——因为本周编写了太多Perl。我已经更正了它。不需要使用“count”变量,因为awk好心地告诉我们“NF”中有多少个字段,我们只需减去一个,就可以将名称作为字段之一。@MarkSetchell保留
count
,但在块的顶部显式地将其定义为
count=NF-1
。作为一个例子,我已经包括了
name=$1
。这是一种使代码自文档化的好方法。