我有CVS文件,这些文件包含我要合并的三个独立列中的日期信息。我得到的信息是:
如何将这3个数字转换为YYYYMMDD
格式的正常日期格式?
我的输入文件如下:
740054,17,40,1,0000000000001,25,25,test1,1
740054,17,40,2,0000000000001,24,24,test2,1
740054,17,40,4,0000000000001,19,19,test3,1
我想要的预期输出是:
740054,20171002,0000000000001,25,25,test1,1
740054,20171003,0000000000001,24,24,test2,1
740054,20171005,0000000000001,19,19,test3,1
以第一行为例:2017年10月2日是2017年第40周的星期一(1)
有人知道如何进行这种转换吗?
答案 0 :(得分:0)
我将假设您的星期数符合ISO 8601的定义(有关其他定义,请参见here)。 ISO 8601 standard已在世界范围内广泛使用:欧盟和其他大多数国家 欧洲国家,亚洲大部分地区和大洋洲
ISO 8601标准规定以下内容:
使用此定义,可能有第53周。这些发生在1月1日是 星期五(例如2016年1月1日,2010年1月1日)。或者,如果前一年是 年,也是星期六。 (例如2005-01-01)
December 2015 January 2016
Mo Tu We Th Fr Sa Su CW Mo Tu We Th Fr Sa Su CW
1 2 3 4 5 6 49 1 2 3 53
7 8 9 10 11 12 13 50 4 5 6 7 8 9 10 01
14 15 16 17 18 19 20 51 11 12 13 14 15 16 17 02
21 22 23 24 25 26 27 52 18 19 20 21 22 23 24 03
28 29 30 31 53 25 26 27 28 29 30 31 04
鉴于year
,week_number
和day_of_week
,我们如何重构日期?答案需要几个步骤,并将计算出所请求日期的年份(doy
)。
要计算一年doy
的一天,我们首先需要确定第一周的开始时间,如上所述。如果1月1日是星期二,则第一周仅包含6天而不是7天,而如果1月1日是星期五,则第一周仅在下一周开始。因此,我们可以通过添加偏移量来解决此问题。偏移量可以在下表中找到:
dow001 str: Mo Tu We Th Fr Sa Su
dow001 num: 01 02 03 04 05 06 07
offset : 0 -1 -2 -3 3 2 1
,此偏移量计算为3-(dow001+2)%7
因此,很容易计算一年中的某天:
doy = (week_number-1) * 7 + 3-(dow001+2)%7 + day_of_week
因此,我们可以编写以下GNU awk工具:
awk 'function compute_date(YYYY,CW,DOW) {
dow001 = strftime("%u",mktime(YYYY " 01 01 00 00 00"))
doy = (CW-1)*7 + (3 - (dow001+2)%7) + DOW
return strftime("%Y%m%d",mktime(YYYY " 01 " doy " 00 00 00"))}
}
BEGIN { FS = OFS = "," }
{ datestr = compute_date(2000+$2,$3,$4) }
{ print $1, datestr , $5,$6,$7,$8,$9 }' file
740054,20171002,0000000000001,25,25,test1,1
740054,20171003,0000000000001,24,24,test2,1
740054,20171005,0000000000001,19,19,test3,1