![将月份数字转换为月份名称](https://linux22.com/image/1384290/%E5%B0%86%E6%9C%88%E4%BB%BD%E6%95%B0%E5%AD%97%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%9C%88%E4%BB%BD%E5%90%8D%E7%A7%B0.png)
有没有办法用脚本将月份数字转换为名称?
例子:
2013-10-22
会变成Oct 22
谢谢。
顺便说一句,我没有 GNU 日期并且我的操作系统是 AIX。
答案1
你应该有一个可用的awk
(或nawk
):
BEGIN {
nmon=split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",month)
for(mm=1;mm<=nmon;mm++) {
month[month[mm]]=mm
month[sprintf("%02i",mm)]=month[mm]
}
}
/[12][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/ {
split($1,bits,/-/)
printf("%s %02i\n",month[bits[2]],bits[3])
}
该BEGIN{}
块创建了一个映射哈希。它的用途比您严格需要的更通用一些(我碰巧有它),它的索引是短名称、月份序数(数字)和带前导零的两位数月份序数。这意味着您可以将名称转换为数字或反之亦然。您也可以轻松地将其调整为长月份名称(可能还有本地化,但我们不要太过分)。
下一个块查找包含可能的日期字符串的行,在“-”处拆分并转换日期。(这也适用于gawk
,但如果您恰好有,那么strftime()
和mktime()
是更优雅的解决方案。)
基本ksh
shell 版本,因为 AIX 具有ksh
:
set -A month pad Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
while IFS=- read yyyy mm dd junk; do
echo ${month[$mm]}
done
这使用大批(POSIXsh
没有数组,bash
但有,所以你也可以用它做类似的事情)。请注意,这依赖于ksh
处理月份数字中的前导 0,它只是将其视为整数。由于ksh
(和bash
) 数组是从零开始的,我们将一个虚拟的“填充”值填充到索引 0 中,而不是在索引上使用 +1/-1。
答案2
date +"%B %d"
将显示January 1
date +"%b %d"
将显示Jan 1