Converter número do mês para o nome do mês

2

Existe uma maneira de converter o número do mês em nome com um script?

exemplo:

2013-10-22 se tornará Oct 22

Obrigado.

BTW, eu não tenho a data GNU e meu SO é AIX.

    
por peja11 31.10.2013 / 10:58

2 respostas

1

Você deve ter um awk (ou nawk ) utilizável:

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])
}

O bloco BEGIN{} cria um hash de mapeamento. É um propósito um pouco mais geral do que você precisa estritamente (por acaso tenho isso por aí), seus índices são o nome curto, o ordinal do mês (número) e o ordinal do mês de dois dígitos com um zero à esquerda. Isso significa que você pode converter o nome em número ou vice-versa. Você pode facilmente adaptá-lo para nomes longos de mês também (e possivelmente localização, mas não vamos nos deixar levar).

O próximo bloco procura por linhas que contenham uma string de data provável, divide em "-" e converte a data. (Isso também funciona em gawk , mas se você tiver isso, então strftime() e mktime() são uma solução mais elegante.)

Uma versão básica do shell ksh , já que o AIX possui 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

Isto usa um array (POSIX sh não tem arrays, bash faz, então você pode fazer algo similar com isso também). Observe que isso depende de ksh para manipular o 0 inicial em um número de mês, apenas o trata como um inteiro. Como os arrays ksh (e bash ) são baseados em zero, colocamos um valor "pad" no índice 0 em vez de reproduzir com + 1 / -1 nos índices.

    
por 31.10.2013 / 12:02
1
date +"%B %d"

Exibirá January 1

date +"%b %d"

Exibirá Jan 1

    
por 31.10.2013 / 11:42