如何使用grep过滤掉包含某一天之前的日期的行

时间:2014-12-03 01:57:46

标签: linux grep

我有一个示例员工数据文件,我想过滤掉 Employement_Status INACTIVE 的行, Hire_Date 是在 2013年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命令应该只删除第二行。

非常感谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

结果

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