Unix将月份名称转换为数字

时间:2013-03-06 16:11:15

标签: shell unix awk

在BASH shell脚本或使用gdate时,如果给出“2011年10月”这样的日期,我该如何转换为年月数字格式?例如,输出应为“2011-10”。

7 个答案:

答案 0 :(得分:9)

mydate="Oct 2011"
date --date="$(printf "01 %s" $mydate)" +"%Y-%m"

GNU日期的parse_datetime接口(这是示例使用的)有很多规则。 2011年10月的日期形式不是其中之一,所以你在它前面添加一个“01”,日期就像它一样。

答案 1 :(得分:7)

read mon year <<< "Oct 2012"
date -d "$mon 1 $year" "+%Y-%m"

结果:

2012-10

答案 2 :(得分:3)

case "`date | awk '{print $2 }'`" in

        Jan) MON=01 ;;
        Feb) MON=02 ;;
        Mar) MON=03 ;;
        Apr) MON=04 ;;
        May) MON=05 ;;
        Jun) MON=06 ;;
        Jul) MON=07 ;;
        Aug) MON=08 ;;
        Sep) MON=09 ;;
        Oct) MON=10 ;;
        Nov) MON=11 ;;
        Dec) MON=12 ;;
esac

echo $MON

答案 3 :(得分:2)

Bash4支持哈希表(尽管Jim的回答是正确的。)

实施例

#!/bin/bash

declare -A months=( ["Jan"]="01" ["Feb"]="02" )

mydate="Jan 2011"

echo ${mydate:4:8}-"${months["${mydate:0:3}"]}"

输出:

2011-01

答案 4 :(得分:2)

您可以通过查找名称字符串的位置将月份转换为数字:

#!/bin/bash

month=Oct
months="JanFebMarAprMayJunJulAugSepOctNovDec"
tmp=${months%%$month*}
month=${#tmp}
monthnumber $((month/3+1))
printf "%02d\n" $monthnumber

上面脚本的输出是:

10

您可以编码的特定字符串:

#!/bin/bash

mydate="Oct 2011"

monthnumber() {
    month=$1
    months="JanFebMarAprMayJunJulAugSepOctNovDec"
    tmp=${months%%$month*}
    month=${#tmp}
    monthnumber=$((month/3+1))
    printf "%02d\n" $monthnumber
}

arr=(`echo ${mydate}`);
month=$(monthnumber ${arr[0]})
year=$(echo ${arr[1]})
echo "$year-$month"

输出结果为:

2011-10

答案 5 :(得分:1)

我不确定是否有更短的方法,但这是一种方法。这绝不是万无一失的。您可以通过向输入添加其他检查来改进这一点,并使比较大小写不敏感。

#!/bin/ksh
### Validate input
if [ $# -eq 0 ]
then
    echo "Usage: $0 InputMonYYYY"
    echo "Example: $0 \"Oct 2011\""
    exit 1
fi
### Read input
INPUTSTR=$1
MON_STR=`echo $INPUTSTR |cut -d' ' -f1`
YYYY_STR=`echo $INPUTSTR |cut -d' ' -f2`

if [[ "$MON_STR" = "Jan" ]] then
  MON_NUM=01
elif [[ "$MON_STR" = "Feb" ]] then
  MON_NUM=02
elif [[ "$MON_STR" = "Mar" ]] then
  MON_NUM=03
elif [[ "$MON_STR" = "Apr" ]] then
  MON_NUM=04
elif [[ "$MON_STR" = "May" ]] then
  MON_NUM=05
elif [[ "$MON_STR" = "Jun" ]] then
  MON_NUM=06
elif [[ "$MON_STR" = "Jul" ]] then
  MON_NUM=07
elif [[ "$MON_STR" = "Aug" ]] then
  MON_NUM=08
elif [[ "$MON_STR" = "Sep" ]] then
  MON_NUM=09
elif [[ "$MON_STR" = "Oct" ]] then
  MON_NUM=10
elif [[ "$MON_STR" = "Nov" ]] then
  MON_NUM=11
elif [[ "$MON_STR" = "Dec" ]] then
  MON_NUM=12
fi
echo ${YYYY_STR}-${MON_NUM}

答案 6 :(得分:0)

让我们踢这匹死马。 如果您不关心无效的月份名称,则可以使用我编写的此函数,该函数很短(仅执行1次),但希望一个月份为有效的英语3字符小写或大写字母,并且仅需要GNU sed和bash:

greeter

以您的示例为例:

greet()