Puede usar nl
para numerar las líneas (ese es el propósito del programa :). Pero necesitas extraer la primera semana del mes de algún lado. Se puede hacer desde ncal
sí mismo:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Insertamos esto como un parámetro para nl
la opción -v
(número de línea inicial), y le decimos que solo numere líneas con números o espacios.
$ 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
Sin embargo, todo esto es terriblemente frágil. De todos modos, si no necesita cal
las opciones más avanzadas, funcionará. Puede ponerlo en un archivo y reemplazarlo "$@"
donde lo puse 2 2012
.
EDITAR: ¡Pero esto está EQUIVOCADO!¡Acabo de notar que la primera semana de enero puede tener el número 52 o 53! Así que solo tenemos que hacer una excepción para enero, o simplemente extraer todos los números de la semana ncal
y aplicarlos a la salida de cal
.
Esta es la solución que pensé originalmente, pero pensé (erróneamente) que lo simplificaría usando nl
. Utiliza paste
, que combina archivos uno al lado del otro. Como no hay ningún archivo, tenemos que usar el bashism <(...)
; eso es lo que estaba tratando de evitar.
Nuestro primer "archivo" será una lista de los números de la semana, con dos líneas vacías al principio:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
El segundo, solo la salida 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
Mucho más desordenado e incompatible que el otro. En fin ...
gcal --starting-day=Monday --with-week-number
se ajusta más a mis necesidades pero esta herramienta es excelente.