如果日期少于当前日期的50天,则删除整行

时间:2017-02-05 09:30:35

标签: shell unix awk ksh

如果日期早于指定列的n天,我需要帮助才能删除行。我的文件包含以下内容。从下面的文件中,我需要找到第4列中当前日期不到50天的条目并删除整行。

ABC, 2017-02-03, 123, 2012-09-08   
BDC, 2017-01-01, 456, 2015-09-05    
Test, 2017-01-05, 789, 2017-02-03

我想要的输出如下。

ABC, 2017-02-03, 123, 2012-09-08
BDC, 2017-01-01, 456, 2015-09-05

注意:我有一个现有脚本,需要将其集成到现有脚本中。

2 个答案:

答案 0 :(得分:2)

您可以利用date命令执行此任务,这将简化脚本

$ awk -v t=$(date -d"-50 day" +%Y-%m-%d) '$4<t' input > output

将在输出文件中包含此内容

ABC, 2017-02-03, 123, 2012-09-08   
BDC, 2017-01-01, 456, 2015-09-05   

用您的文件名替换输入/输出

答案 1 :(得分:0)

您可以使用下面的gawk逻辑,

gawk '
BEGIN {FS=OFS=",";date=strftime("%Y %m %d %H %M %S")}
{
    split($4, d, "-")
    epoch = mktime(d[1] " " d[2] " " d[3] " " "00" " " "00" " " "00")
    if ( ((mktime(date) - epoch)/86400 ) > 50) print
}' file

我们的想法是使用GNU Awk string functions strftime() and mtkime()进行日期转换。前者生成YYYY MM DD HH MM SS格式的时间戳,mktime用于转换为EPOCH时间。

两次,即文件中date的当前时间戳(epoch)和$4转换为EPOCH后,差异除以{{1获取天数差异,只打印差异大于86400的那些行。