आप nlलाइनों की संख्या का उपयोग कर सकते हैं (यह कार्यक्रम का उद्देश्य है :)। लेकिन आपको कहीं से महीने में पहला सप्ताह निकालने की आवश्यकता है। यह ncalखुद से किया जा सकता है :
$ ncal -w 2 2012 | tail -1 | awk '{print $1}'
5
हम इसे एक पैरामीटर के रूप में सम्मिलित करते हैं (लाइन नंबर शुरू) nlविकल्प -v, और इसे केवल संख्या लाइनों के साथ संख्याओं या रिक्त स्थान के लिए बताएं।
$ 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
हालांकि यह सब बहुत ही नाजुक है। वैसे भी, यदि आपको calअधिक उन्नत विकल्पों की आवश्यकता नहीं है, तो यह काम करेगा। आप एक फ़ाइल में रख और जगह ले सकता है "$@"मैं कहाँ रखा 2 2012।
संपादित करें: लेकिन यह गलत है! मैंने अभी देखा कि जनवरी में पहले सप्ताह में नंबर ५२ या ५३ हो सकता है! इसलिए हमें अभी या तो जनवरी के लिए एक अपवाद बनाना होगा, या बस सभी सप्ताह के नंबरों को निकालना होगा ncalऔर उन्हें आउटपुट पर लागू करना होगाcal ।
यह वह समाधान है जो मैंने मूल रूप से सोचा था, लेकिन मैंने सोचा (गलती से) मैं इसका उपयोग करके इसे सरल बना दूंगा nl। यह उपयोग करता है paste, जो फाइलों को साइड-बाय-साइड मर्ज करता है । चूंकि कोई फ़ाइल नहीं है, इसलिए हमें बैशिज़्म का उपयोग करना होगा <(...); यही मैं बचने की कोशिश कर रहा था।
हमारी पहली "फ़ाइल" सप्ताह की संख्याओं की एक सूची होगी, जिसमें शुरुआत में दो खाली लाइनें होंगी:
$ printf ' \n \n' && printf '%2d \n' $(ncal -w 1 2011 | tail -1)
52
1
2
3
4
5
दूसरा वाला, सिर्फ आउटपुट cal। सभी एक साथ, पैरामीटर के रूप में 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
बहुत गड़बड़ और असंगत कि अन्य एक। एन फिन ...
gcal --starting-day=Monday --with-week-numberमेरी जरूरतों को और अधिक फिट करता है फिर भी यह उपकरण बहुत अच्छा है।