我正在尝试计算给定日期的前几个月和下几个月(和年份,但是微不足道)。我将在下个月使用它:
$ awk 'BEGIN{m=12; print m%12+1}'
1
这是恕我直言的,对于之前的版本:
$ awk 'BEGIN{m=1; print (m+10)%12+1}'
12
̲w̲h̲i̲c̲h̲ ̲d̲o̲e̲s̲ ̲t̲h̲e̲ ̲j̲o̲b̲ ̲b̲u̲t̲ ̲w̲h̲i̲c̲h̲ ̲I̲'̲m̲ ̲n̲o̲t̲ ̲h̲a̲p̲y̲
那么,您将以哪种方式计算前几个月和下几个月(和几年)?这是一个测试模板:
$ 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 :(得分:1)
使用三元运算符并覆盖边缘情况
$ 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
$
答案 1 :(得分:1)
我将其封装在函数中
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
我假设您正在为函数提供有效的输入。验证留作练习。
删除函数参数以在全局范围内对变量进行变异。