Есть ли способ конвертировать номер месяца в имя с помощью скрипта?
пример:
2013-10-22
станет Oct 22
Благодарю.
Кстати, у меня нет даты GNU, и моя ОС AIX.
Есть ли способ конвертировать номер месяца в имя с помощью скрипта?
пример:
2013-10-22
станет Oct 22
Благодарю.
Кстати, у меня нет даты GNU, и моя ОС AIX.
date +"%B %d"
Будет отображаться January 1
date +"%b %d"
Будет отображаться Jan 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
, поскольку в 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
При этом используется массив (в POSIX sh
нет массивов, в bash
есть, поэтому вы можете сделать что-то подобное и с ним). Обратите внимание, что для обработки лидирующего 0 в номере месяца используется ksh
, он просто обрабатывает его как целое число. Поскольку массивы ksh
(и bash
) основаны на нуле, мы вставляем фиктивное значение "pad" в индекс 0, а не играем с +1/-1 на индексах.