计算前一个月和下一个月(使用awk)

时间:2019-01-16 13:51:08

标签: awk

我正在尝试计算给定日期的前几个月和下几个月(和年份,但是微不足道)。我将在下个月使用它:

$ 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

2 个答案:

答案 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

我假设您正在为函数提供有效的输入。验证留作练习。

删除函数参数以在全局范围内对变量进行变异。