我需要实现一个正则表达式,该表达式给定以下样本数据集,允许我选择那些出生于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+位数字,,
匹配id1[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'