代码之家  ›  专栏  ›  技术社区  ›  Jose Antonio Piedehierro Arias

BASH基于OR逻辑CSV文件的Grep结果

  •  0
  • Jose Antonio Piedehierro Arias  · 技术社区  · 3 年前

    我有这个CSV文件,基本上是运动员的记录,以及他们的个人信息/奖牌。

    我只需要使用一个egrp(扩展正则表达式)就可以得到以下内容(我几乎拥有所有内容):

    • ID必须有9位数字,第三位必须是0或3。
    • 生日年份必须低于2000年,月份只有10月(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].*
    

    这给我的回报是:

    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,
    

    但它应该返回这个(我基本上已经将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

    您可以使用此网站更快地调试代码和文件:

    https://regex101.com/

    非常感谢,

    1 回复  |  直到 3 年前
        1
  •  1
  •   markp-fuso    3 年前

    样本输入:

    $ 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.72米,所以我们应该很好 2\.[0-9] (不需要 [23]\.[0-9] )
    • 假设感兴趣的字段都没有前导空白
        2
  •  0
  •   tink    3 年前

    认为 此regex满足您的要求:

    \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],$
    
    推荐文章