Vous pouvez utiliser nl
pour numéroter les lignes (c'est le but du programme :). Mais vous devez extraire la première semaine du mois de quelque part. Cela peut se faire de ncal
lui-même:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Nous l'insérons en tant que paramètre de nl
l'option -v
(numéro de ligne de départ), et nous le disons uniquement aux lignes de numéro avec des nombres ou des espaces.
$ 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
Mais tout cela est terriblement fragile. Quoi qu'il en soit, si vous n'avez pas besoin cal
des options plus avancées, cela fonctionnera. Vous pouvez le mettre dans un fichier et remplacer "$@"
où je l'ai mis 2 2012
.
EDIT: Mais c'est faux! Je viens de remarquer que la première semaine de janvier peut avoir le numéro 52 ou 53! Nous devons donc soit faire une exception pour janvier, soit extraire tous les numéros de semaine de ncal
et les appliquer à la sortie de cal
.
C'est la solution que je pensais à l'origine, mais j'ai pensé (à tort) que je la simplifierais en utilisant nl
. Il utilise paste
, qui fusionne les fichiers côte à côte. Puisqu'il n'y a pas de fichier, nous devons utiliser le bashisme <(...)
; c'est ce que j'essayais d'éviter.
Notre premier "fichier" sera une liste des numéros de semaine, avec deux lignes vides au début:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
Le second, juste la sortie de cal
. Tous ensemble, comme paramètrespaste
:
$ 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
Beaucoup plus désordonné et incompatible que l'autre. En fin ...
gcal --starting-day=Monday --with-week-number
correspond plus à mes besoins mais cet outil est génial.