You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:42:26