最近老师交给我一个任务,统计上学期班里的成绩。写个小脚本简单的实现一下。
#!/bin/bash
#scriptname:statistic.sh
#实现功能:
#统计各科参加考试的人数
#在各科在各分数段的人数
#各分数段人数占总人数的比例
#author:along
#date:2009-9-9 22:25
#file从命令行获取成绩单文件
file=$1 #这从命令行获取成绩单文件
file_resualt=$2 #统计结果存放的文件
path="/tmp/score/" #临时文件的存放目录
if [ ! -f $file ]
then
echo "成绩单文件不存在!"
exit 0
fi
#课程名称
name=(\
"C#及.NET技术"\
"微机原理与汇编语言A"\
"软件工程A"\
"windows编程B"\
"数据结构A"\
"离散数学A"\
"英语Ⅳ"\
)
#成绩所在的域
num=(\
"7"\
"7"\
"8"\
"7"\
"8"\
"8"\
"7"\
)
#获取数组的长度
length=${#name[@]}
#判断path路径是否存在,若不存在则创建
if [ ! -d $path ]
then
mkdir $path
fi
i=0
while [ $i -lt $length ]
do
awk '$3~/'${name[$i]}'/{printf("%s \n",$"'${num[$i]}'")}' $file | sort | sed 's/\n/ /'> $path${name[$i]}
i=`expr $i + 1`
done
#对文件中的成绩进行统计
i=0
while [ $i -lt $length ]
do
s1=0 #记录成绩在90-100的人数
s2=0 #记录成绩在80-89的人数
s3=0 #记录成绩在70-79的人数
s4=0 #记录成绩在60-69的人数
s5=0 #记录成绩在60以下的人数
sum=0 #记录总人数
for score in `cat $path${name[$i]}`
do
if [ $score -ge "90" ]
then
s1=`expr $s1 + 1`
elif [ $score -ge "80" ] && [ $score -le "89" ]
then
s2=`expr $s2 + 1`
elif [ $score -ge "70" ] && [ $score -le "79" ]
then
s3=`expr $s3 + 1`
elif [ $score -ge "60" ] && [ $score -le "69" ]
then
s4=`expr $s4 + 1`
else
s5=`expr $s5 + 1`
fi
done
sum=$(($s1 + $s2 + $s3 + $s4 + $s5))
echo "---------------${name[$i]}---------------------" >>$file_resualt
echo "分数段 90-100 80-89 70-79 60-69 <60" >>$file_resualt
echo "人数 $s1 $s2 $s3 $s4 $s5" >>$file_resualt
s1=`echo "scale=3; $s1 / $sum" | bc`
s2=`echo "scale=3; $s2 / $sum" | bc`
s3=`echo "scale=3; $s3 / $sum" | bc`
s4=`echo "scale=3; $s4 / $sum" | bc`
s5=`echo "scale=3; $s5 / $sum" | bc`
s1=`printf "%0.3f" $s1`
s2=`printf "%0.3f" $s2`
s3=`printf "%0.3f" $s3`
s4=`printf "%0.3f" $s4`
s5=`printf "%0.3f" $s5`
#echo "---------------${name[$i]}--------------" >>result
#echo "90-100 80-89 70-79 60-69 <60" >>result
echo "比例 $s1 $s2 $s3 $s4 $s5" >>$file_resualt
echo "总人数:$sum" >> $file_resualt
echo -e "\n\n">> $file_resualt
i=`expr $i + 1`
done
rm -fr $path
|
运行时需要指定源文件和统计结果存放的文件如:
./
statistic.sh file resualt
阅读(1383) | 评论(0) | 转发(0) |