正则表达式为 select 条满足数值条件的记录

regular expression to select records that meet numerical conditions

我需要实现一个正则表达式,给定以下示例数据集,允许我 select 那些出生在 2000 年 1 月之前的学生记录,其课程成绩是高于 1.7。例如,下面示例中命令的结果应该是第二条记录

id, date of birth, grade, explusion, serious misdemeanor
123,2005-01-01,5.36,1,1
582,1999-10-12,8.51,0,1
9274,2001-25-12,9.65,0,0

我尝试了以下方法,但执行后没有任何结果


grep -E "^*,1[0-9]{3}(-[0-9]{2}){2}*[10],(1\.[7-9][1-9])]"

知道哪里出了问题吗?

在你的正则表达式中,我找不到一月份的部分,而且成绩看起来不正确。这是一个更简单的:

grep -E '1...-..-01,([2-9]\.)|(1\.[7-9][1-9])'

解释:

1...-..-01     year=1xxx, month=01
[2-9]\.|       grade 2-9 or
1.[7-9][1-9]   grade 1.7[1-9]

假定 grade < 10(可以轻松更改)。

awk 更直接一些:

awk -F[,-] '<2000 && =="01" &&  > 1.7'

使用 grep,您可以将完整的模式写为

grep -E '^[0-9]+,1[0-9]{3}-[0-9]{2}-0?1,(1\.(7[1-9][0-9]*|[89][0-9]*)|[2-9](\.[0-9]+)?|10(\.0+)?),[0-9]+,[0-9]+$' file
  • ^ 字符串开头
  • [0-9]+, 匹配 1+ 个数字和 , 作为 id
  • 1[0-9]{3}-匹配1、3位数字和-为年份
  • [0-9]{2}-0?1, 匹配 2 位数字 - 和 01 或 1 代表一月
  • ( 备选方案组
    • 1\.(7[1-9][0-9]*|[89][0-9]*) 匹配 1.71-1.79 或 1.8 或 1.9 所有后跟可选数字
    • |
    • [2-9](\.[0-9]+)? 匹配 2-9 可选后跟 . 和 1+ 数字
    • |
    • 10(\.0+)? 匹配 10 可选后跟 . 和零(假设 10 是最高等级)
  • ), 关闭群组并匹配一个逗号
  • [0-9]+,[0-9]+ 匹配最后 2 列值,假设 1+ 位
  • $ 字符串结束

看到一个regex demo and a bash demo.