Unix 文件中的awk bash平均值计算
编写unix命令以显示每个科目成绩超过50分且平均成绩大于或等于75分的所有学生的名单、姓名和平均成绩 平均值可计算为(subc_1+subc_2)/2 输入:Unix 文件中的awk bash平均值计算,unix,awk,Unix,Awk,编写unix命令以显示每个科目成绩超过50分且平均成绩大于或等于75分的所有学生的名单、姓名和平均成绩 平均值可计算为(subc_1+subc_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 &&
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
我不知道为什么我会出错。
请帮助大家。编辑:添加更通用的解决方案,其中OP的输入文件可能有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
编辑:添加更通用的解决方案,其中OP的输入文件可能有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
NR>1-e
awk
不是shell
,它有自己的(不同的)语言。没有-e
。你所说的-e
是什么意思?它应该做什么?是的,你可以用“&&”代替-e@AkshaySingh,您不需要将OFS的设置为空格,因为其默认值本身就是空格。从逻辑上看,它看起来不错,但我还没有对它进行测试,而且在我相信您已经知道的一些地方,您也不需要&&
。感谢您分享您的努力,请继续努力,并确保您始终以代码的形式在问题中添加您的努力,这是非常受鼓励的,因此,快乐学习。感谢先生,您一如既往的快速反馈,让我们保持积极性…您不能在任何shell中的单引号删除字符串(包括脚本)中使用单引号。在语法上,您需要awk'BEGIN{FS=“,”OFS=“”}
,而不是awk'BEGIN{FS=“,”OFS=“”}
(当然OFS=“”
实际上并没有做任何事情,因为这是默认设置)。wrtif(NR>1(&&&$3>50…
)-我不知道你在哪里写cond1(&&cond2)
,而不是像你在脚本的其余部分那样写cond1&&(cond2)
。NR>1-e
awk
不是shell
,它有自己的(不同)语言。没有-e
。你所说的-e
是什么意思?它应该做什么?是的,你可以使用“&&&”而不是-e@AkshaySingh,您不需要将OFS
设置为空格,因为它的默认值本身就是空格。从逻辑上看,它看起来还可以,但我还没有测试过它,而且在我相信您已经知道的一些地方,您也不需要&
。感谢您分享您的成果,请继续努力,并确保始终在中添加您的成果您的问题中的代码形式非常受鼓励,祝您学习愉快。感谢您一如既往的快速反馈,保持我们的积极性…您不能在任何shell中的单引号删除字符串(包括脚本)中使用单引号。在语法上,您需要的是awk'BEGIN{FS=',';OFS='}
,而不是awk'BEGIN{FS=,“OFS=”}
(当然,OFS=“”
实际上没有做任何事情,因为这是默认设置)。wrtif(NR>1(&&&$3>50…
)-我不知道在哪里可以编写cond1(&&cond2)
而不是cond1&(cond2)
,就像你在脚本的其余部分那样。