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)
但对我来说,这似乎并没有很好地利用关联数组的强大功能,而且我必须手动初始化数组中的每个月.
我还有什么其他选择?
内置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.