Puede usar nlpara 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 ncalsí mismo:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Insertamos esto como un parámetro para nlla 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 callas 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 ncaly 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-numberse ajusta más a mis necesidades pero esta herramienta es excelente.