题目

1、切换到目录/public/workspace/shaojf/Course/Linux/wkdir4finalexam。

2、在该目录下创建新目录,目录名同本人账号,例如账号名为stu20230101,则新目录名为stu20230101,后续所有输出请保存到该目录。

3、将step2所建的目录权限设为"rwx---r-x"。

4、将/public/workspace/shaojf/Course/Linux/finalexam/bmei_events目录下所有后缀名为txt的文件复制到step2所建的目录。

5、已知all.stu.txt为需做核酸检测的学生名单,tested.stu.txt为已做核酸检测的学生名单,请利用grep或diff等命令,输出尚未做核酸检测的学生名单,保存到文件out.untested(预期输出如/public/workspace/shaojf/Course/Linux/finalexam/out.untested)。

6、已知old.login.txt和recent.login.txt分别是不同数据库档案中导出的用户登录次数统计,请合并文件,将同一个用户的两个登录次数显示在同一行,即第一列为用户名,第二列为old.login.txt中的次数,第三列为recent.login.txt中的次数(预期输出如/public/workspace/shaojf/Course/Linux/finalexam/out.login.combinded)。

7、以step6产生的文件作为输入(如未能生成,可从考试目录中直接cp进行本步骤操作),计算每个用户的总登录次数,并按照登录次数从大到小排序,保存到文件out.login.combinded.srt(预期输出如/public/workspace/shaojf/Course/Linux/finalexam/out.login.combinded.srt)。

8、以all.login.txt作为输入,其中一行表示一次登录,请计算每个用户的总登录次数,并按照登录次数从大到小排序,保存到文件out.login.count.srt(预期输出如/public/workspace/shaojf/Course/Linux/finalexam/out.login.count.srt)。

9、week16.classes.txt为工信院第16周线上课程汇总信息,以其作为输入,统计工信院负责的教学中,每个教学班的课程数,并按照课程次数从大到小排序,保存到文件out.classes.srt(预期输出如/public/workspace/shaojf/Course/Linux/finalexam/out.classes.srt)。

10、输出本账号历史命令的最后100行,保存到文件mycmd中。随后用vim在mycmd的最后新增一行,内容为:我是,春暖花开之际,共祝国泰民安。其中处改为本人真实姓名。

参考答案

  1. cd /public/workspace/shaojf/Course/Linux/wkdir4finalexam
  2. mkdir `whoami`
  3. chmod 705 `whoami`
  4. cp /public/workspace/shaojf/Course/Linux/finalexam/bmei_events/*.txt `whoami`/
  5. cd `whoami`; grep -v -f tested.stu.txt all.stu.txt > out.untested; 或diff --left-column <(sort all.stu.txt) <(sort tested.stu.txt) | grep "<" | cut -d " " -f 2- > out.untested
  6. join <(sort old.login.txt) <(sort recent.login.txt) > out.login.combinded
  7. awk '{print $1"\t"$2+$3}' out.login.combinded | sort -k 2,2nr > out.login.combinded.srt
  8. awk '{print $1}' all.login.txt | sort | uniq -c | sort -k1 -nr > out.login.count.srt
  9. cut -f 12 week16.classes.txt | sed 's?;?\n?g' | sort | uniq -c | sort -k1 -nr > out.classes.srt
  10. history | tail -100 > mycmd

其他解决方案

2+3

李锦鹏:mkdir -m 705 stu21250108

4

常规思路就是利用通配符一次性把几个文件cp过去。但是有人尝试了一下高级解决思路(张柏宁一个失败的尝试) find /public/workspace/shaojf/Course/Linux/finalexam/bmei_events -name "*.txt" -exec cp -rf {} /public/workspace/shaojf/Course/Linux/wkdir4finalexam/stu21250110/ 没成功的原因是最后还需要加上"\;" 利用find拓展应用例如:把某个目录下权限为755且为最近365天内修改过的且为常规文件类型的文件复制到某个目录。

5

一个是总名单,一个是已做核酸的名单,求解未做核酸的名单(我特地把学生顺序打乱了)。常规解决思路:用grep或diff查找不在已做核酸名单里的学生名单即可,甚至join结合grep也可以实现。另一种解决思路(又是李锦鹏):合并两份名单,查找只出现了一次的学生名字(这种解决方案如果遇到以下情况会出现bug,即如果已做核酸的名单含有非总名单上的人的名字)。 李锦鹏:cat all.stu.txt tested.stu.txt | sort | uniq -u > out.untested

类似应用例如:一份RBP list,一份差异基因list,问哪些基因既是RBP又是差异基因。

6

两个文件,第一列都为账号,第二列都为登录次数,需要将两个文件中记录的同一个账号的登录次数显示在同一行。常规解决思路:join合并,需注意要预先将两个文件sort好。另一种解决思路(还是是李锦鹏):比较awk的NR和FNR值,利用数组保存信息(这种解决方案如果遇到以下情况会出现bug,即如果两份文件顺序不同或总行数不同)。 李锦鹏:awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if($1 in a)print a[$1],$2}' old.login.txt recent.login.txt

类似应用例如:多次不同实验得到的结果,合并成一个矩阵用于后续分析。

9

先看看题目,是统计这个表格里,教学班出现的频次。解决思路:提取教学班这一列,遇到分号则需要拆分统计。 王俞响:tail -n +2 week16.classes.txt | sed -e 's/\t/\n/g' | grep '班' | sed -e 's/;/\n/g' | sort | uniq -c | sort -nrk 1 > out.classes.srt 姚富珅:awk 'NR>1 {print $NF}' week16.classes.txt | sed 's/;/\n/g' | sort | uniq -c | sort -nrk1 > out.classes.srt 郎程闰:cut -f 12 week16.classes.txt | tr ';' '\n' | sort | uniq -c | sort -k1,1nr > out.classes.srt

类似应用例如:统计病历记录中某些项目的频次。