如何获取awk中两个日期之间的差异天数

时间:2015-07-08 10:54:36

标签: awk

我需要从 awk 中的文件中读取日期格式。 我文件中的每一行都有两个日期数据,一个在第一个元素中,另一个在第二个元素中。格式为day/month/year。 有没有办法比较awk中的两个日期。 例如,如果我有03/05/201505/05/2015,我需要2天作为答案。

很抱歉没有为我的问题提供示例输入/输出。输入实际上与Akshay描述的相同。 我有一个文件,其中每行以两个日期开头

03/05/2015   05/05/2015

对应于进程的开始和结束(第二个总是发生在第一个之后)。 我使用awk进行硬编码来读取有关两个日期的信息。 这不是最佳解决方案,但我需要在昨天之前获得一些结果。 简单地说,我提取每个日期的日,月和年,并计算他们相隔多少天  我也做了一个简单的检查,看看相应的年份是否是闰年。

awk'{

D1= int(substr($1,1,2));   
D2= int(substr($2,1,2));    
M1= int(substr($1,4,2));    
M2= int(substr($2,4,2));    
Y1 = int(substr($1,7,4));    
Y2 = int(substr($2,7,4));

leap1 = ((Y1-2008)%4)?1:0;

leap2 = ((Y2-2008)%4)?1:0;

cnt1 = 0;

ii = 1; 

while(ii<D1) {
if(ii==2) cnt1+=(leap1+28); else{if((ii==1)||(ii==3)||(ii==5)||(ii==7)||(ii==8)||(ii==10)||(ii==12)) cnt1+=31; if((ii==4)||(ii==6)||(ii==9)||(ii==11)) cnt1+=30;}ii++;}

cnt2 = 0;

ii = 1; 

while(ii<D2)

 {
if(ii==2) cnt2+=(leap2+28); else{if((ii==1)||(ii==3)||(ii==5)||(ii==7)||(ii==8)||(ii==10)||(ii==12)) cnt2+=31; if((ii==4)||(ii==6)||(ii==9)||(ii==11)) cnt2+=30;}ii++;}

Day = cnt2-cnt1+D2-D1+(Y2-Y1)*365;

}`

我知道这远非最佳,但我需要快速制作一些东西。

2 个答案:

答案 0 :(得分:2)

我认为您的输入看起来像这样

输入文件

[akshay@localhost tmp]$ cat file
03/05/2015 05/05/2015
06/03/2015 08/05/2015

脚本 - 特定GAWK

[akshay@localhost tmp]$ cat date_diff_gawk.awk
function date2time(date,     a)
{
        split(date, a, /\//)
        return mktime(a[3] " " a[2] " " a[1] " 0 0 0")
}
function abs(n)
{
        return n<0 ? -n : n
}
function diff_days(d1,d2,    delta)
{
        delta = date2time(d1) - date2time(d2)
        return int(abs(delta)/86400)
}
{
    print $0, diff_days($2,$1) " days"
}

脚本 - 任何awk

[akshay@localhost tmp]$ cat date_diff_anyawk.awk
BEGIN {
    split("0,31,59,90,120,151,181,212,243,273,304,334",D,/,/)
}
function dfm(date,   a,year,month,day)
{
        split(date,a,/\//)
        year = a[3]; month = a[2]+0; day = a[1]
        date = ((year - 1970) * 365.25) + D[month] + day - 1
        if ((year % 4) == 0 && month > 2) { date = date + 1}
        return (date * 86400 - (25200))/86400
}
function abs(n)
{
        return n<0 ? -n : n
}
function date_diff(d1,d2)
{
    return  abs(dfm(d1)-dfm(d2))
}
{
    print $0,date_diff($2,$1) " days"
}

<强>执行

[akshay@localhost tmp]$ awk -f date_diff_gawk.awk file
03/05/2015 05/05/2015 2 days
06/03/2015 08/05/2015 63 days

[akshay@localhost tmp]$ awk -f date_diff_anyawk.awk file
03/05/2015 05/05/2015 2 days
06/03/2015 08/05/2015 63 days

[akshay@localhost tmp]$ echo '06/03/2015 31/05/2015' | awk -f date_diff_any_awk.awk 
06/03/2015 31/05/2015 86 days

答案 1 :(得分:-2)

实际上我找到了一种使用substr()比较两个日期的方法。它不是最有效的方式,但似乎有效。

我只是提取两个日期的日,月和年,并将它们转换为&#34; int&#34;通过使用int(..)。这样我就可以提取两个日期之间的差异。