正则表达式来选择满足数值条件的记录



我需要实现一个正则表达式,该表达式给定以下样本数据集,允许我选择那些出生于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,您可以将整个模式编写为

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演示和bash演示。

在您的正则表达式中,我找不到一月部分,而且分数看起来不正确。这里有一个更简单的:

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[,-] '$2<2000 && $4=="01" && $5 > 1.7'

最新更新