2014-12-03 24 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

相關問題