Sie können verwenden, nlum die Zeilen zu nummerieren (das ist der Zweck des Programms :). Aber Sie müssen die erste Woche im Monat irgendwo extrahieren. Es kann von ncalselbst gemacht werden:
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
Wir fügen dies als Parameter in nldie Option -v(Startzeilennummer) ein und teilen es nur Zahlenzeilen mit Zahlen oder Leerzeichen mit.
$ 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
Das ist alles furchtbar zerbrechlich. Auf jeden Fall calfunktioniert es , wenn Sie keine erweiterten Optionen benötigen . Sie können es in eine Datei einfügen und ersetzen"$@" wo ich es abgelegt habe 2 2012.
EDIT: Aber das ist FALSCH! Mir ist gerade aufgefallen, dass die erste Januarwoche die Nummer 52 oder 53 haben kann! Wir müssen also entweder eine Ausnahme für Januar machen oder einfach alle Wochennummern aus extrahieren ncalund auf die Ausgabe von anwenden cal.
Dies ist die Lösung, die ich ursprünglich dachte, aber ich dachte (fälschlicherweise), ich würde es mit vereinfachen nl. Dabei werden pasteDateien nebeneinander zusammengeführt. Da es keine Datei gibt, müssen wir den Bashismus verwenden <(...). das wollte ich vermeiden.
Unsere erste "Datei" ist eine Liste der Wochennummern mit zwei Leerzeilen am Anfang:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
Der zweite ist nur die Ausgabe von cal. Alles in allem als Parameter für 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
Viel chaotischer und unvereinbarer als der andere. En fin ...
gcal --starting-day=Monday --with-week-numberPasst mehr zu meinen Bedürfnissen, aber dieses Tool ist großartig.