2014-12-03 323 views
0

我有一个样本的员工数据文件前行,我要筛选出列,其中Employement_Status列为INACTIVEHIRE_DATE之前是2013年6月1日如何使用grep过滤掉包含日期是某月某日

文件中的行看起来像这样

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

grep的唯一无法做到这一点。似乎你需要有awk或perl。 – 2014-12-03 02:05:50

+0

你能告诉我如何用awk做到这一点吗? – user59036 2014-12-03 02:15:05

+0

可能重复的[如何通过日期时间范围grep?](http://stackoverflow.com/questions/5533671/how-to-grep-by-date-time-range) – tripleee 2014-12-03 06:49:52

回答

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 
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 

UPDATE看来我理解错在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 
+0

啊正确的,不知何故,我误解了它。更新了答案。 – Ashalynd 2014-12-06 14:46:33

相关问题