使用awk在数字和数字之间转换月份

Bra*_*son 3 awk associative-array type-conversion

在过去的考试论文中,我有一个问题:

月份可以用不同的方式表示,例如数字(1,2,...,12),或三个字母的月份名称(Jan,Feb,...,Dec).建议如何使用awk中的关联数组将三个字母的月份名称转换为月份数字,反之亦然,将月份数字转换为三个字母的月份名称.

所以我想我会在格式中使用关联数组,说月份的输入是1美元:

number_to_month["Jan"] = 1;
print number_to_month[$1]
Run Code Online (Sandbox Code Playgroud)

但对我来说,这似乎并没有很好地利用关联数组的强大功能,而且我必须手动初始化数组中的每个月.

我还有什么其他选择?

dmc*_*kee 5

内置split函数在这里是你的朋友,循环可以将name-from-number版本复制到number-from-name:

BEGIN {
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",month)
    for (i in month) {
        month_nums[month[i]]=i
    }
}
END {
    for (i in month) {
        print i "\t" month[i]
    }
    for (m in month_nums) {
        print m "\t" month_nums[m]
    }
}
Run Code Online (Sandbox Code Playgroud)

BEGIN块显示了如何执行此操作.然后END阻止只是让你验证它.

我得到的输出(使用gawk 4.0.1)是:

4       Apr
5       May
6       Jun
7       Jul
8       Aug
9       Sep
10      Oct
11      Nov
12      Dec
1       Jan
2       Feb
3       Mar
Feb     2
Sep     9
Jan     1
May     5
Apr     4
Oct     10
Dec     12
Nov     11
Jul     7
Mar     3
Aug     8
Jun     6
Run Code Online (Sandbox Code Playgroud)

注意由于无法在阵列循环上强制访问顺序而产生的通常的尴尬(Heh!AWKwardness)for.