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