Shell Unix将月份名称转换为数字

Shell Unix将月份名称转换为数字,shell,unix,awk,Shell,Unix,Awk,在bashshell脚本或使用gdate时,给定一个类似“2011年10月”的日期,如何转换为年-月数字格式?例如,输出应为“2011-10” mydate="Oct 2011" date --date="$(printf "01 %s" $mydate)" +"%Y-%m" GNU date的parse_datetime接口(本例就是使用这个接口)有很多规则。2011年10月的日期不是其中之一,所以你在它的前面加了一个“01”,date喜欢它。我不确定是否有较短的方法,但这里有一种方法。这绝

在bashshell脚本或使用gdate时,给定一个类似“2011年10月”的日期,如何转换为年-月数字格式?例如,输出应为“2011-10”

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

GNU date的parse_datetime接口(本例就是使用这个接口)有很多规则。2011年10月的日期不是其中之一,所以你在它的前面加了一个“01”,date喜欢它。

我不确定是否有较短的方法,但这里有一种方法。这绝非易事。您可以通过向输入中添加其他检查并使比较不区分大小写来改进这一点

#!/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}

Bash4支持哈希表(不过Jim的答案是正确的)

范例

#!/bin/bash

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

mydate="Jan 2011"

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

2011-01

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

#/bin/bash
月份=10月
月数=“一月至四月至六月至七月至十月至十二月”
tmp=${months%%$month*}
月份=${tmp}
月数$((月/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

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

m2n() { echo $((-10+$(sed 's/./\U&/g;y/ABCEGLNOPRTUVY/60AC765A77ABB9/;s/./+0x&/g'<<<${1#?}) ));}

m2n(){echo$(-10+$(sed's/\U&/g;y/abceglnoprutvy/60AC765A77ABB9/;s/+0x&/g')您甚至可以跳过
read
命令,因为“2012年10月1日”是
date
dateStr=“2012年10月”;date-d“1$dateStr”+%y-%m”的公认输入格式
再多解释一下就好了,比如1在$mon和$year之间,而+在%Y前面。我发现$mon后面的1就像一个标志,上面写着“使用缩写月”。当使用选项指定日期时,+是
,任何非选项参数都必须是以“+”开头的格式字符串。
mon=(1-2-3-4-5-6-7-8-9-10-11-12)echo${mon[3]}这对我不起作用,我不得不在
$mydate
周围加上引号,这样第二行就会读到
date--date=“$(printf“01%s”“$mydate”)”+%Y-%m“
,否则
2011年10月
变成
2011年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
m2n() { echo $((-10+$(sed 's/./\U&/g;y/ABCEGLNOPRTUVY/60AC765A77ABB9/;s/./+0x&/g'<<<${1#?}) ));}
read m y <<<"$@"; echo "$y-`m2n $m`"