如何从demo文件提取姓名以b开头且以y结尾(不区分大小写)的学生成绩
提取指定规则学生成绩的方法
从名为demo的成绩文件中,提取姓名以字母b开头且以y结尾(不区分大小写)的学生各科成绩,可通过以下几种方法实现:
方法一:使用awk命令直接处理
awk可直接对每行字段做正则匹配和输出:
- 输出符合条件的整行记录:
awk 'tolower($2) ~ /^b.*y$/' demo
解释:$2指代每行的姓名字段,tolower()将姓名转为小写,/^b.*y$/匹配以b开头、y结尾的字符串,匹配成功则输出整行。
- 仅提取科目与对应成绩(成对输出):
awk 'tolower($2) ~ /^b.*y$/ {for(i=3;i<=NF;i+=2) print $i, $(i+1)}' demo
解释:匹配成功后,从第3个字段开始,每隔一个字段输出科目和对应的成绩。
方法二:grep+awk组合过滤
先用grep过滤符合姓名规则的行,再用awk整理成绩:
- 先过滤出目标学生的整行:
grep -i '^Student [bB][^ ]*[yY] ' demo
解释:-i参数忽略大小写,正则^Student [bB][^ ]*[yY] 精准匹配开头为Student、姓名以b/B开头且以y/Y结尾的行。
- 进一步提取科目和成绩:
grep -i '^Student [bB][^ ]*[yY] ' demo | awk '{for(i=3;i<=NF;i+=2) print $i, $(i+1)}'
方法三:Python脚本处理
适合需要自定义输出格式或后续逻辑扩展的场景,编写脚本process_scores.py:
with open('demo', 'r') as f: for line in f: parts = line.strip().split() if len(parts) < 2: continue name = parts[1] if name.lower().startswith('b') and name.lower().endswith('y'): print("学生姓名:", name) print("各科成绩:") for idx in range(2, len(parts), 2): print(f"{parts[idx]}: {parts[idx+1]}")
运行脚本:
python process_scores.py
内容的提问来源于stack exchange,提问作者hth_zard
相关产品推荐
相关产品推荐

