Расчет предыдущего и следующего месяцев (с использованием awk)

Я пытаюсь вычислить предыдущий и следующий месяцы (и год, но это было тривиально) для данной даты. Я использую это для следующего месяца:

$ awk 'BEGIN{m=12; print m%12+1}'
1

, что довольно жестко, ИМХО, и для предыдущего:

$ awk 'BEGIN{m=1; print (m+10)%12+1}'
12

& # x332; w & # x332; h & # x332; я & # X332; с & # X332; ч & # X332; & # X332; д & # X332; о & # X332; е & # X332; s & # X332; & # X332; т & # X332; ч & # X332; е & # X332; & # X332; J & # X332; о & # X332; б & # X332; & # X332; б & # X332; у & # X332; т & # X332; & # X332; ш & # X332; ч & # X332; я & # X332; с & # X332; ч & # X332; & # X332; I & # X332; '& # X332; м & # X332; & # X332; п & # X332; о & # X332; т & # X332; & # X332; ч & # X332, A & # X332; р & # X332; р & # X332; у & # X332; & # x332; w & # x332; i & # x332; t & # x332; h & # x332 ;, я чувствую, что это может быть в более жесткой форме, но просто не могу понять это банкоматом.

Итак, как бы вы рассчитали предыдущий и следующий месяцы (и годы)? Вот тестовый шаблон:

$ awk '{
    y=substr($1,1,4)             # extract yyyy from yyyymmdd
    m=substr($1,5,2)+0           # extract mm from yyyymmdd
    print "this:", m, y, 
          "next:", m%12+1,
                   y+(m==12),
          "prev;", (m+10)%12+1,  # optimize me
                   y-(m==1)
}' <(echo -e 20190116 \\n 20181231)
this: 1 2019 next: 2 2019 prev; 12 2018
this: 12 2018 next: 1 2019 prev; 11 2018
0
задан James Brown 16 January 2019 в 14:12
поделиться

2 ответа

Я бы включил это в функции:

awk '
    function next_month(year, month) {
        month++;
        if (month == 13) {
            year++;
            month = 1;
        }
        return sprintf "%d-%02d", year, month;
    }

    function previous_month(year, month) {
        month--;
        if (month == 0) {
            year--;
            month = 12;
        }
        return sprintf "%d-%02d", year, month;
    }

    BEGIN {
        year = 2019; month = 1;
        printf "%d-%d\t%s\t%s\n",
            year, month,
            next_month(year, month),
            previous_month(year, month);

        year = 2018; month = 12;
        printf "%d-%d\t%s\t%s\n",
            year, month,
            next_month(year, month),
            previous_month(year, month);
    }
'
2019-1  2019-02 2018-12
2018-12 2019-01 2018-11

Я предполагаю, что вы предоставляете действительный ввод для функций. Валидация оставлена ​​в качестве упражнения.

Удалите параметры функции, чтобы изменить переменные в глобальной области видимости.

0
ответ дан glenn jackman 16 January 2019 в 14:12
поделиться

Использование тернарного оператора и покрытие краевых случаев

$ awk '{  y=substr($1,1,4); m=substr($1,5,2) ; mn=m==12?1:m+1;yn=mn==1?y+1:y; mp=m+0==1?12:m-1;yp=mp==12?y-1:y; print "next ",mn,yn,m,y; print "prev ",mp,yp,m,y } ' <(echo -e 20190116 \\n 20181231)
next  2 2019 01 2019
prev  12 2018 01 2019
next  1 2019 12 2018
prev  11 2018 12 2018
$
0
ответ дан stack0114106 16 January 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: