Используя 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