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

Короче говоря:

В последней итерации

for(int i = 0; i<=name.length; i++) {

i будет равно name.length, что является незаконным индексом, так как индексы массива равны нулю, основанный.

Ваш код должен читать

for(int i = 0; i < name.length; i++) 
                 ^
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
поделиться
Другие вопросы по тегам:

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