Используя awk, как конвертировать даты в неделю и квартал?

Используя awk, как преобразовать даты (гггг-мм-дд) в неделю и квартал (первый день недели установлен на понедельник)?

Входные данные:

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

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,"-") - разделить 2-е поле (date) по разделителю -

  • mktime(datespec) - превратить datepec (указание даты) в метку времени

  • strftime("%W", mktime(d[1]" "d[2]" "d[3]" 00 00 00")) - отформатировать время, возвращаемое mktime() функционировать в соответствии с %W (номер недели в году)

  • q = int((d[2]+2)/3) - расчет номера квартала. Квартал эквивалентен 3 месяцам. Поэтому мы будем использовать 3 в качестве делителя.

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

Другие вопросы по тегам