【问题标题】:how to use grep to filter out rows that contain dates that are before a certain day如何使用 grep 过滤掉包含某一天之前的日期的行
【发布时间】:2014-12-06 22:46:06
【问题描述】:

我有一个示例员工数据文件,我想过滤出 Employement_Status 列为 INACTIVEHire_Date2013 年 6 月 1 日之前。

文件中的行如下所示

FirstName    LastName     BirthDate    EmploymentStatus    HireDate
  Tom           Red       5/16/1956        INACTIVE        4/13/1999
 Sandy         Green      12/21/1973       INACTIVE        12/20/2013
 John          Yellow     11/15/1983        ACTIVE         8/17/2000

而且 grep 命令应该只删除第二行。

非常感谢

【问题讨论】:

标签: linux grep


【解决方案1】:

不是单线解决方案,而是:

filter.awk:

BEGIN {
  FS  = " "
  year  = 2013
  month  = 6
}
{
  split($5, a, "/")
  if( $4=="INACTIVE" && ((a[3] < year) || ((a[3] == from) && (a[1] < month)))) print $0;
}

这样称呼:

awk -f filter.awk <your-example-file>

结果:

FirstName    LastName     BirthDate    EmploymentStatus    HireDate
  Tom           Red       5/16/1956        INACTIVE        4/13/1999

更新似乎我误解了 OP 中的“过滤掉”这个词。如果意图是删除具有给定条件的行,则可以反转语句:

if(!( $4=="INACTIVE" && ((a[3] < year) || ((a[3] == from) && (a[1] < month))))) print $0;

给出结果:

FirstName    LastName     BirthDate    EmploymentStatus    HireDate
 Sandy         Green      12/21/1973       INACTIVE        12/20/2013
 John          Yellow     11/15/1983        ACTIVE         8/17/2000

【讨论】:

    【解决方案2】:
    function op(qr) {
      split(qr, st, "/")
      return sprintf("%d%02d%02d", st[3], st[1], st[2])
    }
    NR > 1 &&
    $4 == "INACTIVE" &&
    op($5) < op("6/1/2013") {next}
    1
    

    这样跑

    awk -f infile.awk infile.txt
    

    结果

    名字姓氏出生日期就业状态雇用日期 桑迪格林 1973 年 12 月 21 日 未激活 2013 年 12 月 20 日 约翰·黄 1983 年 11 月 15 日活动 2000 年 8 月 17 日

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多