Короче говоря:
В последней итерации
for(int i = 0; i<=name.length; i++) {
i
будет равно name.length
, что является незаконным индексом, так как индексы массива равны нулю, основанный.
Ваш код должен читать
for(int i = 0; i < name.length; i++)
^
Я бы включил это в функции:
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
Я предполагаю, что вы предоставляете действительный ввод для функций. Валидация оставлена в качестве упражнения.
Удалите параметры функции, чтобы изменить переменные в глобальной области видимости.
Использование тернарного оператора и покрытие краевых случаев
$ 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
$