【问题标题】:Using awk, how to convert dates to week and quarter?使用 awk,如何将日期转换为周和季度?
【发布时间】:2017-05-27 08:56:24
【问题描述】:

使用awk,如何将日期(yyyy-mm-dd)转换为周和季度(一周的第一天设置为星期一)?

输入:

a;2016-04-25;10
b;2016-07-25;20
c;2016-10-25;30
d;2017-02-25;40

想要的输出:

a;2016-04-25;10;2016-w17;2016-q2
b;2016-07-25;20;2016-w30;2016-q3
c;2016-10-25;30;2016-w43;2016-q4
d;2017-02-25;40;2017-w8;2017-q1

【问题讨论】:

  • 你尝试了什么?我会使用date(ISO 周、周日/周一开始周等)。
  • @JamesBrown 同时阅读 f1 f2 f3;做回声 -n $f1;回声-n“”;回声-n $f2;回声-n“”; date -d $f2 +%V;done
  • @Markus 添加您尝试质疑的代码而不是 cmets... 并参阅 mywiki.wooledge.org/BashFAQ/001 指定分隔符

标签: date awk date-formatting week-number date-manipulation


【解决方案1】:

awk解决方案:

awk -F';' '{ split($2,d,"-"); w = strftime("%W", mktime(d[1]" "d[2]" "d[3]" 00 00 00")); 
           q = int((d[2]+2)/3); 
           print $0,d[1]"-w"w,d[1]"-q"q}' OFS=';' file

输出:

a;2016-04-25;10;2016-w17;2016-q2
b;2016-07-25;20;2016-w30;2016-q3
c;2016-10-25;30;2016-w43;2016-q4
d;2017-02-25;40;2017-w08;2017-q1

  • split($2,d,"-") - 通过分隔符 - 分割第二个字段 (date)

  • mktime(datespec) - 将 datespec(日期规范)转换为时间戳

  • strftime("%W", mktime(d[1]" "d[2]" "d[3]" 00 00 00")) - 根据%W(一年中的周数)格式化mktime()函数返回的时间

  • q = int((d[2]+2)/3) - 计算 季度 数字。该季度相当于 3 个月。所以我们将使用 3 作为除数。

https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

【讨论】:

  • @EdMorton,是的,只是错过了我的“视觉区域”
  • 这个解决方案不能解决除夕的一周:)
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 2021-07-26
  • 2023-01-20
  • 2016-02-10
  • 2018-10-31
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多