【问题标题】:awk bash avg calculation in file文件中的 awk bash avg 计算
【发布时间】:2020-06-12 23:12:29
【问题描述】:

编写unix命令,显示每科50分以上,平均分75分以上的所有学生的roll、name和avg。

avg 可以计算为 (subj_1+subj_2)/2。

输入:

roll ,name,subScore1,subScore2
123,a,88,78
101,b,76,90
812,c,78,98

输出:

123 a 83
812 c 78

我的代码:

awk 'BEGIN {FS=',';OFS=' '} {if(NR>1 (&& $3>50 && $4>50) && ($3+$4)/2 >= 75){print $1,$2,($3+$4)/2}}' input_file

我不知道为什么会出错。 请大家帮忙。

【问题讨论】:

  • NR>1 -e awk 不是shell,它有自己的(不同的)语言。没有-e-e 是什么意思?它应该怎么做?
  • 是的,你可以用“&&”代替-e
  • @AkshaySingh,您不需要将OFS 设置为空格,因为它的默认值本身就是空格。从逻辑上讲,它看起来不错,但我还没有测试过,而且在我相信你已经知道的几个地方你也不需要&&。感谢您分享您的努力,继续努力,并确保您始终以代码形式在您的问题中添加您的努力,这在 SO,快乐学习方面受到强烈鼓励。
  • 感谢先生,您一如既往的快速反馈,让我们保持动力......
  • 您不能在任何 shell 中的单引号分隔的字符串(包括脚本)中使用单引号。而不是awk 'BEGIN {FS=',';OFS=' '},在语法上你需要awk 'BEGIN {FS=",";OFS=" "}(当然OFS=" "实际上并没有做任何事情,因为这是默认设置)。 wrt if(NR>1 (&& $3>50... - 我不知道你会在哪里写 cond1 (&& cond2) 而不是 cond1 && (cond2) 就像你在脚本的其余部分中所做的那样。

标签: unix awk


【解决方案1】:

编辑:添加更通用的解决方案,其中 OP 的 Input_file 可能有超过 4 个字段/列,在这种情况下可以尝试关注。

awk '
BEGIN{
  FS=","
}
FNR==1{
  next
}
{
  for(i=3;i<=NF;i++){
    if($i>=50){
      ++count
    }
    sum+=$i
  }
  avg=(sum/count)
  if(count==(NF-2) && avg>=75){
    print $1,$2,avg
  }
  count=sum=avg=0
}
'   Input_file


您能否尝试使用 GNU awk 使用所示示例进行跟踪、编写和测试。

awk '
BEGIN{
  FS=","
}
FNR==1{
  next
}
avg=($3+$4)/2
avg>=75 && ($3>=50 && $4>=50){
  print $1,$2,avg
}
'  Input_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多