Você pode usar nl
para numerar as linhas (essa é a finalidade do programa :). Mas você precisa extrair a primeira semana do mês de algum lugar. Isso pode ser feito a partir do ncal
:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Inserimos isso como um parâmetro para a opção nl
-v
(número da linha inicial) e informamos apenas as linhas numéricas com números ou espaços.
$ cal 2 2012 | nl -bp'^[0-9 ]\+$' -w2 -s' ' -v$(ncal -w 2 2012 | tail -1 | awk '{print $1}')
February 2012
Su Mo Tu We Th Fr Sa
5 1 2 3 4
6 5 6 7 8 9 10 11
7 12 13 14 15 16 17 18
8 19 20 21 22 23 24 25
9 26 27 28 29
Isso tudo é muito frágil. De qualquer forma, se você não vai precisar das opções mais avançadas do cal
, ele funcionará. Você pode colocá-lo em um arquivo e substituir "$@"
onde eu coloquei 2 2012
.
EDIT: Mas isso é ERRADO! Eu só notei que a primeira semana de janeiro pode ter o número 52 ou 53! Por isso, temos que abrir uma exceção para janeiro ou apenas extrair all os números das semanas de ncal
e aplicá-los à saída de cal
.
Esta é a solução que pensei originalmente, mas pensei (erroneamente) que simplificaria usando nl
. Ele usa paste
, que mescla arquivos lado a lado. Como não há arquivos, temos que usar o bashism <(...)
; é o que eu estava tentando evitar.
Nosso primeiro "arquivo" será uma lista dos números da semana, com duas linhas vazias no começo:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
O segundo, apenas a saída de cal
. Todos juntos, como parâmetros para paste
:
$ paste -d' ' <(printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)) <(cal 1 2011)
January 2011
Su Mo Tu We Th Fr Sa
52 1
1 2 3 4 5 6 7 8
2 9 10 11 12 13 14 15
3 16 17 18 19 20 21 22
4 23 24 25 26 27 28 29
5 30 31
Muito messier e incompatível que o outro. En fin ...