如何使用日期和.dat文件

时间:2016-03-24 23:06:09

标签: bash awk

我有这个.dat文件:

933|Mahinda|Perera|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox
1129|Carmen|Lepland|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer
4194|Hồ Chí|Do|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer
8333|Chen|Wang|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer
8698|Chen|Liu|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox
8853|Albin|Monteno|male|1986-04-09|2010-03-19T21:52:36.860+0000|178.209.14.40|Internet Explorer
10027|Ning|Chen|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox
1099511628908|Wei|Chen|female|1985-08-02|2010-05-24T20:52:26.582+0000|27.98.244.108|Firefox
1099511633435|Jack|Smith|male|1981-04-19|2010-05-26T03:45:11.772+0000|50.72.193.218|Internet Explorer
1099511635042|Gyorgy|Kiss|male|1984-09-14|2010-05-16T22:57:41.808+0000|91.137.244.86|Chrome

我想选择两个日期之间的所有行。例如,我想把所有从 1980-01-01 出生的人带到 1987-01-01

我正在尝试:

if [ $1 == "--born-since" ] && [ $3 == "--born-until" ] && [ $5 == "-f" ]; then
    since=$(date -d $2 +"%Y%m%d")
    until=$(date -d $4 +"%Y%m%d")
    awk -F '|' -v UNTIL="$until" SINCE="$since" '($5 < UNTIL)($5 > SINCE){print}' $6
fi

但这似乎不对。

即使我尝试仅选择自“日期”以来出生,但这不起作用:

if [ $1 == "--born-since" ] && [ $3 == "-f" ]; then
    since=$(date -d $2 +"%Y%m%d")
    awk -F '|' -v SINCE="$since" '($5 > SINCE){print}' $4
fi

任何帮助?

2 个答案:

答案 0 :(得分:1)

你有:

since=$(date -d $2 +"%Y%m%d")
until=$(date -d $4 +"%Y%m%d")

也就是说,您定义的格式类似于19891203

但是在您的文件中,日期格式为:1989-12-03。你无法比较它们。

您可以在date命令中更改输出格式,使其与dat文件中的日期格式相同。

答案 1 :(得分:0)

我同意这可能是由于不同的时间格式。试试这个:

awk -F "|" -v since=$2 -v until=$4 '
    function dattimestamp(s) {
        return mktime(gensub("-", " ", "g", s) " 00 00 00")
    }

    function argtimestamp(s) {
        return mktime(substr(since,0,4) " " substr(since,4,2) " " substr(since,6,2) " 00 00 00")
    }

    BEGIN {since=argtimestamp(since); until=argtimestamp(until)} 

    dattimestamp($5)>since && dattimestamp($5)<until {print}'

这将处理dat文件和参数的不同时间格式,并将它们转换为基于纪元的时间,易于比较。

还有改进的余地,它运行dattimestamp功能两次,而实际只需要一次。