获取日期列小于一个月的文件中的所有记录

获取日期列小于一个月的文件中的所有记录

输入文件

ID,Name,join_date
21433432,rds,2014_02_01
2131321,ABCDS,2014-10-20
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

需要创建两个文件,其中一个用于日期列小于一个月和小于 6 个月的记录

输出文件 1 小于一个月

ID,name,join_date
2432745314,ASRER, 2015-01-20
2132432423,safdsad, 2015-12-30

输出文件2不到6个月

2131321,ABCDS,2014-10-20

使用该awk命令但不起作用。

答案1

这将帮助您开始。需要 GNU awk 来实现时间函数:

gawk -F, '
    function totime(ymd) {gsub(/[-_]/," ",ymd); return mktime(ymd " 0 0 0")}
    BEGIN {now = systime(); m1 = now - 86400 * 30; m6 = now - 86400 * 180}
    FNR == 1 {next}
    {t = totime($3)}
    t > m1 {print "m1", $0; next}
    t > m6 {print "m6", $0}
' file
m6 2131321,ABCDS,2014-10-20
m1 2432745314,ASRER, 2015-01-20
m1 2132432423,safdsad, 2015-12-30

不完全是 1 个月和 6 个月,而是 30 天和 180 天,加上或减去夏令时过渡一小时

答案2

只需使用date内部命令并根据某些条件awk将输出重定向到所需的文件:print

awk -F, 'BEGIN{ "date -d\"month ago\" +%s" | getline T1; close("date"); 
  "date -d\"6 months ago\" +%s" | getline T6; close("date")}
  { "date -d" $3 " +%s" | getline t; close("date"); 
  if(t>T1){print $0>"file2";next} if(t>T6)print $0>"file3"}' file

关键部分是使用命令将日期格式转换为 1970 年以来的秒数date -d ... "+%s"。其余的应该是不言自明的。

相关内容