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

如何获取awk中两个日期之间的差异天数,awk,Awk,我需要从awk中的文件中读取日期格式。 我的文件中的每一行都有两个日期数据,一个在第一个元素中,另一个在第二个元素中。格式为day/month/year。 在awk中有没有比较两个日期的方法。 例如,如果我有2015年5月3日和2015年5月5日,我需要2天的时间作为答案 很抱歉,没有为我的问题提供示例输入/输出。输入实际上与Akshay描述的相同。 我有一个文件,其中每行以两个日期开头 03/05/2015 05/05/2015 对应于流程的开始和结束(第二个流程总是发生在第一个流程之

我需要从awk中的文件中读取日期格式。 我的文件中的每一行都有两个日期数据,一个在第一个元素中,另一个在第二个元素中。格式为
day/month/year
。 在awk中有没有比较两个日期的方法。 例如,如果我有
2015年5月3日
2015年5月5日
,我需要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;

}`
awk'{
D1=整数(substr($1,1,2));
D2=整数(substr($2,1,2));
M1=整数(substr($1,4,2));
M2=int(substr($2,4,2));
Y1=整数(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;

而(ii我假设你的输入是这样的

输入文件

[akshay@localhost tmp]$ cat file
03/05/2015 05/05/2015
06/03/2015 08/05/2015
脚本-特定于目瞪口呆的

[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"
}

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


我只需提取两个日期的日、月和年,并使用int(..)将它们转换为“int”。这样我就可以提取两个日期之间的差异。

很好地展示了您迄今为止所尝试的内容,以及更清晰的输入/所需的输出。请阅读。非常好。时间函数可能需要GNU awk。这似乎不太可能是最好的方法,但如果没有示例输入和预期输出,我们就无法做到帮助您。您如何知道代码中哪个月有多少天(特别是如果二月有28天或29天)?
[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