![获取日期列小于一个月的文件中的所有记录](https://linux22.com/image/60758/%E8%8E%B7%E5%8F%96%E6%97%A5%E6%9C%9F%E5%88%97%E5%B0%8F%E4%BA%8E%E4%B8%80%E4%B8%AA%E6%9C%88%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E8%AE%B0%E5%BD%95.png)
输入文件
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"
。其余的应该是不言自明的。