2013-03-06 4 views
4

В сценариях оболочки BASH или с использованием gdate, учитывая дату типа «окт 2011», как мне конвертировать в формат числа год-месяц? Например, выход должен быть «2011-10».Unix convert Month name to number

ответ

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

parse_datetime интерфейс даты GNU (который является то, что в данном примере используется) имеет множество правил. форма даты в октябре 2011 года не является одной из них, поэтому вы добавляете «01» к ней, а дата нравится.

+0

Это не работает для меня, я должен был поставить кавычки '$ mydate' так что вторая строка читает 'date -date = '$ (printf" 01% s "" $ mydate ")" + "% Y-% m" ', так как иначе' Oct 2011' становится 'Oct2011' –

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} 
+0

mon = (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) echo $ {mon [3] } – Nayeem

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

Результат:

2012-10 
+2

Вы даже можете пропустить команду 'read', так как« 1 октября 2012 »является принятым форматом ввода для' date': 'dateStr =" Oct 2012 "; date -d "1 $ dateStr" "+% Y-% m" ' – chepner

+0

немного больше объяснений будет приятным, например, с 1 между $ mon и $ year и + перед% Y. – wordsforthewise

+0

Я понял, что 1 после $ mon - это как флаг, который говорит «использовать сокращенный месяц». + является 'при использовании опции для указания даты (да), любой необязательный аргумент должен быть строкой формата, начинающейся с '+'' – wordsforthewise

2

Bash4 поддерживает хэш-таблицы (ответ Джим является правильным, хотя).

Пример

#!/bin/bash 

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

mydate="Jan 2011" 

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

Выход:

2011-01 
2
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 
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 
Смежные вопросы