正则表达式为 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.
我需要实现一个正则表达式,给定以下示例数据集,允许我 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+ 个数字和,
作为 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 demo and a bash demo.