BASH-Grep结果基于OR逻辑CSV文件
BASH-Grep results based on OR logic CSV file
我有这个 CSV 文件,基本上是运动员的记录,以及他们的个人 info/medals。
我只需要一个 egrep(扩展正则表达式)就可以得到以下内容(我几乎什么都有):
- ID 必须有 9 位,第三位必须是 0 或 3。
- 生日年份必须小于 2000,月份只能是十月 (10)。
- 运动员的身高必须等于或大于 1,7(我在这里很挣扎)。小数点后第二位不能为0.
- 它必须至少获得过一枚奖牌(金牌或银牌,无论多少,但至少一枚),但不能是铜牌。
到目前为止,我什么都有,但高度需要最后一分钟的更改才能始终为真(因为我不知道怎么说可以是 1 米和 7-9 之间,但同时,接受2 米和 0-9 之间)。
奖牌,我不知道如何告诉系统,如果金大于0,银可以为0,反之...
\d\d[0|3]\d\d\d\d\d\d,.*[1]\d\d\d[-][1][0][-]\d\d,[1|2].[7-9][^0],\d\d,.*[0-9],[1-9],[0].*
这 return 我是这样的:
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
但它应该 return 这个(为了演示,我基本上已经将 1 从白银位置改为黄金位置):
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
文件存储在这里:
https://github.com/jpiedehierroa/files/blob/main/athletesv2.txt
您可以使用此站点更快地调试代码和文件:
非常感谢,
我认为这个正则表达式可以满足您的要求:
\d\d[0|3]\d\d\d\d\d\d,.*[1]\d\d\d[-][1][0][-]\d\d,(1\.[7-9]|2\.[0-9])[^0],\d\d,.*(1,1|0,1|1,0),[0-9],$
示例输入:
$ cat medals.dat
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
999946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
999956660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
999972998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-08-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.65,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,0,0,3,
注意: 前 6 行来自 OP 的预期输出;最后 6 行是相同行的修改副本;最后 6 行不应出现在输出中
一个egrep/regex
想法:
$ egrep '^[0-9]{2}[03][0-9]{6},([^,]*,){3}1...-10[^,]*,(1\.[7-9]|2\.[0-9])[0-9]*,([^,]*,){2}([^0]|[^,]*,[^0])' medals.dat
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
备注:
- 我的
egrep
版本似乎不支持 \d
因此使用 [0-9]
- 有史以来最高的人(到目前为止)是 2.72m 所以我们应该很好用
2\.[0-9]
(即不需要 [23]\.[0-9]
)
- 假设 none 个感兴趣的字段有前导白色 space
我有这个 CSV 文件,基本上是运动员的记录,以及他们的个人 info/medals。
我只需要一个 egrep(扩展正则表达式)就可以得到以下内容(我几乎什么都有):
- ID 必须有 9 位,第三位必须是 0 或 3。
- 生日年份必须小于 2000,月份只能是十月 (10)。
- 运动员的身高必须等于或大于 1,7(我在这里很挣扎)。小数点后第二位不能为0.
- 它必须至少获得过一枚奖牌(金牌或银牌,无论多少,但至少一枚),但不能是铜牌。
到目前为止,我什么都有,但高度需要最后一分钟的更改才能始终为真(因为我不知道怎么说可以是 1 米和 7-9 之间,但同时,接受2 米和 0-9 之间)。 奖牌,我不知道如何告诉系统,如果金大于0,银可以为0,反之...
\d\d[0|3]\d\d\d\d\d\d,.*[1]\d\d\d[-][1][0][-]\d\d,[1|2].[7-9][^0],\d\d,.*[0-9],[1-9],[0].*
这 return 我是这样的:
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
但它应该 return 这个(为了演示,我基本上已经将 1 从白银位置改为黄金位置):
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
文件存储在这里:
https://github.com/jpiedehierroa/files/blob/main/athletesv2.txt
您可以使用此站点更快地调试代码和文件:
非常感谢,
我认为这个正则表达式可以满足您的要求:
\d\d[0|3]\d\d\d\d\d\d,.*[1]\d\d\d[-][1][0][-]\d\d,(1\.[7-9]|2\.[0-9])[^0],\d\d,.*(1,1|0,1|1,0),[0-9],$
示例输入:
$ cat medals.dat
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
999946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
999956660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
999972998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-08-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.65,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,0,0,3,
注意: 前 6 行来自 OP 的预期输出;最后 6 行是相同行的修改副本;最后 6 行不应出现在输出中
一个egrep/regex
想法:
$ egrep '^[0-9]{2}[03][0-9]{6},([^,]*,){3}1...-10[^,]*,(1\.[7-9]|2\.[0-9])[0-9]*,([^,]*,){2}([^0]|[^,]*,[^0])' medals.dat
353946547,Arthur van Doren,BEL,male,1994-10-01,1.78,74,hockey,0,1,0,
820456660,Giulia Emmolo,ITA,female,1991-10-16,1.71,67,aquatics,0,1,0,
230772998,Kelly Brazier,NZL,female,1989-10-28,1.71,70,rugby sevens,0,1,0,
713017392,Pavlo Tymoshchenko,UKR,male,1986-10-13,1.92,78,modern pentathlon,0,1,0,
110156979,Lauritz Schoof,GER,male,1990-10-07,1.95,98,rowing,1,0,0,
730877927,Matthew Centrowitz,USA,male,1989-10-18,1.76,65,athletics,1,0,0,
备注:
- 我的
egrep
版本似乎不支持\d
因此使用[0-9]
- 有史以来最高的人(到目前为止)是 2.72m 所以我们应该很好用
2\.[0-9]
(即不需要[23]\.[0-9]
) - 假设 none 个感兴趣的字段有前导白色 space