Linux shell编程统计学生出勤次数

目录下有每次点名的记录文件,如下

每个文件里有每次点名的出勤记录

刚学linux对shell编程完全不会,求帮!

[root@aliyun_ecs linux2021Spring]# cd /home/buyhorse/records/linux2021Spring
[root@aliyun_ecs linux2021Spring]# ls
202104221015  202104221016
[root@aliyun_ecs linux2021Spring]# cat 202104221015 
10:
USER TTY FROM LOGIN
buyhorse
stu3203
stu3204
stu3205
stu3203
stu3207
stu3207
stu3207
stu3203

[root@aliyun_ecs linux2021Spring]# cat 202104221016
10:
USER TTY FROM LOGIN
buyhorse
stu3203
stu3204
stu3205
stu3203
stu3207
stu3207
stu3207
stu3203

[root@aliyun_ecs linux2021Spring]#   awk '{if(!NF ||/^#/ ||/^USER/ || /^[0-9]/){next}{print $1}}' * |sort -r|uniq  -c|awk -F' ' -v 'OFS=:' '{ swap = $2; $2 = $1; $1 = swap; print }'
stu3207:6
stu3205:2
stu3204:2
stu3203:6
buyhorse:2

 cd /home/buyhorse/records/linux2021Spring #进入对应目录 保证目录只有你要统计的如过不是 * 替换成能匹配你所有要统计的文件如2021*

awk '{if(!NF ||/^#/ ||/^USER/ || /^[0-9]/){next}{print $1}}' * |sort -r|uniq  -c|awk -F' ' -v 'OFS=:' '{ swap = $2; $2 = $1; $1 = swap; print }'

#{if(!NF ||/^#/ ||/^USER/ || /^[0-9]/){next}{print $1}}' * 是从当前目录读取数据,并跳过空行 首行是USER和数字的 

#sort -r是反向排序,一定先排序再去重复

#uniq  -c去重复再统计重复的数量,不过结果是数字在前

#awk -F' ' -v 'OFS=:' '{ swap = $2; $2 = $1; $1 = swap; print }' 按用户:数量调换顺序。

看你规则你的帐号应该就是buyhorse把,sort -r 就是反序,学生是stuxxx 反序后是排在buyhorse前.如果不是可以再来一次匹配 匹配到的值做为变量,最后输出 awk '{if(/buyhor/){temp =$NF ;{next}}{print}}END{print temp}'

[root@aliyun_ecs linux2021Spring]# cd /home/buyhorse/records/linux2021Spring
[root@aliyun_ecs linux2021Spring]# awk '{if(!NF ||/^#/ ||/^USER/ || /^[0-9]/){next}{print $1}}' * |sort |uniq  -c|awk '{print $2":"$1}'
buyhorse:2
stu3201:1
stu3203:6
stu3204:2
stu3205:2
stu3207:6
[root@aliyun_ecs linux2021Spring]# awk '{if(!NF ||/^#/ ||/^USER/ || /^[0-9]/){next}{print $1}}' * |sort |uniq  -c|awk '{print $2":"$1}'|awk '{if(/buyhor/){temp =$NF ;{next}}{print}}END{print temp}'
stu3201:1
stu3203:6
stu3204:2
stu3205:2
stu3207:6
buyhorse:2
[root@aliyun_ecs linux2021Spring]# 

 

 

如果对你有帮助 ,请帮忙点个采纳。你的认可是我们互助的动力。( 点击我回答右上角的【采纳】按钮 )