我需要从 awk 中的文件中读取日期格式。
我文件中的每一行都有两个日期数据,一个在第一个元素中,另一个在第二个元素中。格式为day/month/year
。
有没有办法比较awk中的两个日期。
例如,如果我有03/05/2015
和05/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;
}`
我知道这远非最佳,但我需要快速制作一些东西。
答案 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(..)。这样我就可以提取两个日期之间的差异。