我有一个示例员工数据文件,我想过滤掉 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命令应该只删除第二行。
非常感谢
答案 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