2

Есть ли способ конвертировать номер месяца в имя с помощью скрипта?

пример:

2013-10-22 станет Oct 22

Благодарю.

Кстати, у меня нет даты GNU, и моя ОС AIX.

2 ответа2

1
date +"%B %d"

Будет отображаться January 1

date +"%b %d"

Будет отображаться Jan 1

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 , он просто обрабатывает его как целое число. Поскольку массивы kshbash) основаны на нуле, мы вставляем фиктивное значение "pad" в индекс 0, а не играем с +1/-1 на индексах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .