Ncal या cal का उपयोग करके निश्चित प्रारूप में सप्ताह की संख्या प्रदर्शित करना


16

क्या आपको यह पसंद नहीं है, जब दो आज्ञाएँ एक-एक चीज़ आप चाहते हैं लेकिन दोनों नहीं करते हैं?

ये क्या calकरता है अच्छा स्वरूपण। हालांकि सप्ताह संख्या में कमी:

$ cal
    January 2012      
Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31              

ये क्या ncalकरता है अजीब प्रारूपण, लेकिन सप्ताह संख्याओं के साथ:

$ ncal -w
    January 2012      
Su  1  8 15 22 29   
Mo  2  9 16 23 30   
Tu  3 10 17 24 31   
We  4 11 18 25      
Th  5 12 19 26      
Fr  6 13 20 27      
Sa  7 14 21 28      
    1  2  3  4  5   

मैं जिस तरह का आउटपुट चाहता हूं, वास्तव में उसके बीच एक क्रॉसब्रिड calऔर ncal -w:

$ cal --magik-calendar-week-option
      January 2012      
   Su Mo Tu We Th Fr Sa  
1   1  2  3  4  5  6  7  
2   8  9 10 11 12 13 14  
3  15 16 17 18 19 20 21  
4  22 23 24 25 26 27 28  
5  29 30 31

जवाबों:


13

यदि इनमें से कोई भी आदेश आपकी आवश्यकताओं के अनुरूप नहीं है तो आप इसका उपयोग कर सकते हैं gcal हैं कि आप इसके बजाय क्या चाहते हैं।

उदाहरण

$ gcal -K

      April 2014
 Su Mo Tu We Th Fr Sa CW
        1  2  3  4  5 13
  6  7  8  9 10 11 12 14
 13 14 15 16 17 18 19 15
 20 21 22 23 24 25 26 16
 27 28 29 30          17

अंतिम कॉलम में सप्ताह संख्या को दाईं ओर प्रिंट करता है।

संदर्भ


gcal --starting-day=Monday --with-week-numberमेरी जरूरतों को और अधिक फिट करता है फिर भी यह उपकरण बहुत अच्छा है।
k0pernikus

9

यह आज की तारीख को हाइलाइट करता है, और किसी भी महीने $1फॉर्म के माध्यम से प्रदर्शित कर सकता है: YYYY-mm-dd... यह आज की तारीख में चूक करता है

यह आईएसओ सप्ताह संख्याओं को दिखाने के लिए स्थापित किया गया है, और सोमवार को पहला सप्ताह का दिन है।

#!/bin/bash
# Input reference date is expected in  'YYYY-mm-dd' format
#
today=($(date '+%Y %m %d')); Y=0; m=1; d=2                # establish today's date
[[ -z $1 ]] && ref=(${today[@]}) || ref=(${1//-/ })       # get input date
dNbA=$(date --date="$(date +%Y-%m-01)" +'%u')             # day-number of 1st day of reference month
today[m]=$((10#${today[m]})); ref[m]=$((10#${ref[m]}))    # remove leading zero (octal clash)
today[d]=$((10#${today[d]})); ref[d]=$((10#${ref[d]}))    # remove leading zero (octal clash)
nxtm=$(( ref[m]==12 ?1       :ref[m]+1 ))                 # month-number of next month
nxtY=$(( ref[m]==12 ?ref[Y]+1:ref[Y]   ))                 # year-number of next month
nxtA="$nxtY-$nxtm-1"                                      # date of 1st day of next month
refZ=$(date --date "$(date +$nxtA) yesterday" +%Y-%m-%d)  # date of last day of reference  month
days=$(date --date="$refZ" '+%d')                         # days in reference month

h1="$(date --date="${ref[Y]}-${ref[m]}-${ref[d]}" '+%B %Y')" # header 1 
h2="Mo Tu We Th Fr Sa Su"                                    # header 2 
printf "    %$(((${#h2}-${#h1}-1)/2))s%s\n" " " "$h1"
printf "    %s\n" "$h2"
# print week rows   
printf "%2d  " "$((10#$(date -d "$(date +${ref[Y]}-${ref[m]}-01)" +'%V')))" # week-number (of year) with suppressed leading 0
printf "%$(((dNbA-1)*3))s"  # lead spaces (before start of month)
dNbW=$dNbA  # day-number of week
dNbM=1      # day-number of month
while ((dNbM <= days)) ;do
    if (( today[Y]==ref[Y] &&  
          today[m]==ref[m] && 
          today[d]==dNbM )) ;then
        printf "\x1b[7m%2d\x1b[0m " "$dNbM" # highlight today's date 
    else
        printf "%2d " "$dNbM"
    fi
    ((dNbM++))
    if ((dNbW  >=7)) ;then
        cdate=$((10#$(date -d "$(date +${ref[Y]}-${ref[m]}-$dNbM)" +'%V'))) # remove leading zero (octal clash)
        printf "\n%2d  " "$cdate" # week-number of year
        dNbW=0
    fi
    ((dNbW++))
done
printf "%$(((8-dNbW)*3))s\n" # trailing spaces (after end of month)

यहाँ इस महीने का प्रदर्शन है ( 20हाइलाइट किया गया)

       January 2012
    Mo Tu We Th Fr Sa Su
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                

मैंने आइसो-इश्यू को नोटिस भी नहीं किया था। वह करेंगे :)
k0pernikus

1
@ k0pernikus: मैंने अभी स्क्रिप्ट को संशोधित किया है .. (ऊपर की टिप्पणी पोस्ट करने के लगभग 35 मिनट बाद) .. इसे पकड़ा जा रहा था 08और दशमलव के बजाय अष्टक के09 रूप में व्याख्या की जा रही थी .. यह अब ठीक होना चाहिए ...
पीटर

7

आप 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

बहुत गड़बड़ और असंगत कि अन्य एक। एन फिन ...


इतना महान नहीं :-/। मेरा संपादन देखें।
कोण

7

साथ में दोनों आउटपुट साइड होने के लिए सप्ताह के अनुक्रम के साथ उत्पन्न करें ncalऔर उपयोग करें paste

$ paste <(echo; echo; ncal -w | tail -1 | xargs -n1 printf '%2d\n') <(cal)

यदि आप टैब को सीमांकक के रूप में रखना पसंद नहीं करते हैं, तो कुछ ऐसा जोड़ें sed 's/\t/ /'


संपादित करें : सरल तरीके से, टैब के बारे में परवाह करने की आवश्यकता नहीं है:

$ paste -d' ' <((echo -n '   '; ncal -w | tail -1 )| fold -w 3) <(cal)

सुरुचिपूर्ण और ESR के 17 यूनिक्स नियमों में से कई का प्रतीक है । स्वीकृत उत्तर होना चाहिए क्योंकि यह वास्तव में calऔर ncal( calया तो या अन्य व्यवहार को दोहराता है ncal) के आउटपुट को जोड़ता है ।
बिशप

4

पर्ल का उपयोग करने का एक तरीका ( calकमांड की मेरी आउटपुट भाषा स्पेनिश है, लेकिन मुझे आशा है कि परिणाम अंग्रेजी से भिन्न नहीं होगा):

$ cal | perl -pe 'if ( m/\A\s*\d/ ) { s/\A/++$i . qq[ ] x 2/e } else { s/\A/qq[ ] x 3/e }'

आउटपुट:

       enero de 2012   
   lu ma mi ju vi sá do
1                     1
2   2  3  4  5  6  7  8
3   9 10 11 12 13 14 15
4  16 17 18 19 20 21 22
5  23 24 25 26 27 28 29
6  30 31

स्पष्टीकरण:

-pe                     # For every input line from previous pipe, execute  next
                        # instructions and print to output.
if ( m/\A\s*\d/ )       # If line begins with a digit omitting spaces...
s/\A/++$i . qq[ ] x 2/e # Insert at the beginning of the line a counter plus two spaces.
else                    # else...
s/\A/qq[ ] x 3/e        # Insert three spaces at the beginning of the line.

बाद के महीनों के लिए यह कैसे काम करेगा। फरवरी सप्ताह फिर से 1 से शुरू नहीं होते हैं, वे 5/6 से शुरू होते हैं इसी तरह मार्च 9/10 से होगा।
निखिल मुल्ले

सीएएल 02 2012, क्या यह विफल हो जाएगा ??
निखिल मुल्ले

@ निखिल: मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है। क्या आप इसे और गहराई से समझाने की कोशिश कर सकते हैं? क्या स्क्रिप्ट के साथ असफल हो जाता है cal 02 2012? यह मेरे टेस्ट में काम करने वाला लग रहा था।
बीरी

@ निखिल: आह, ठीक है। मुझे सवाल याद आ गया। इसका अर्थ है पूर्ण सप्ताह की संख्या और प्रत्येक माह के सापेक्ष नहीं। मैं थोड़ी देर में अपना गलत उत्तर हटा दूंगा।
बीरी

1
अच्छा..क्योंकि उत्तर को हटाएं नहीं, कृपया इसे संदर्भ के लिए रखें।
निखिल मुल्ले

1

स्लम द्वारा जवाब पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि के बिना , मैक ओएस का उपयोग करके गॉकेट को स्थापित किया जा सकता है brew install gcal

(मुझे पहले यहाँ उत्तर मिला, फिर यह उत्तर अलग-अलग पूछने पर, लेकिन यूनिक्स उत्तर में मैक पर स्थापित करने के लिए आवश्यक सभी जानकारी का अभाव था।)


0

यहां मेरा समाधान है जो कोड में छोटा है और चालू माह की तुलना में अन्य तिथियों के लिए ठीक काम करता है। अमेरिकी लोगों के लिए खेद है, यह आईएसओ प्रारूप का उपयोग करता है, अर्थात सप्ताह का 1 दिन सोमवार है। यह कैल के लिए -m विकल्प और दिनांक के लिए% V विकल्प के साथ किया जाता है

#!/bin/bash
if [ "$1" = "" ]
then
  when="now"
else
  when="$1"
fi
y=$(date --date "$when" +%Y )
if [ $? -ne 0 ]
then
  exit
fi
m=$(date --date "$when" +%m )
w=$(date --date $(printf %4d%02d01 $y $m) +%V)
cal -m $m $y |
  awk -v w=$w '
    NR>2{ww=w++}
    $0!=""{printf "%2s %s\n", ww , $0}
  '

0

मैंने यह स्क्रिप्ट टीमों के लिए ऑन-ड्यूटी कैलेंडर बनाने के लिए किया था। यह सप्ताह के नंबरों और उन्हें (केवल राउंड-रॉबिन) नाम देने के साथ कैलेंडर उत्पन्न करता है। आउटपुट प्रिंट होने के बाद आपको इसे एक्सेल में कॉपी करने और "टेक्स्ट टू कॉलम" करने की ज़रूरत है; और एक बार फिर "निश्चित" विकल्प का उपयोग करके पहले कॉलम पर "कॉलम से टेक्स्ट" करें। इस कैलेंडर (क्षैतिज अभिविन्यास के साथ तुलना) का लाभ यह है कि आप ऑटो-फिल्टर (Alt + dff) का उपयोग कर सकते हैं और केवल अपने सप्ताह पा सकते हैं।

#! / Usr / bin / ksh
y = 2017
सेट-ए 1 टीम पेटर्स जस्टस रिचर्ड जुक्का जेसपर
सेट-टीम 2 मोडेस्टास टिमो मैट एंड्रियास

i1 = 0
i2 = 0
wn = 1
खुद = 1

इको "डब्ल्यूएन मंथ मो तू हम फ्र सा सा; टीम 1; टीम 2"
ycal = `m में 1 2 3 4 5 6 7 8 9 10 11 12 के लिए
कर
आईएफएस =
        cal -m $ m $ y | egrep -v "Mo | ^ $" | जबकि लाइन पढ़ें
        कर
                इको $ लाइन | grep -q $ y && mname = $ लाइन || $ mname $ लाइन प्रिंट करें। sed 's /' $ y '//'
        किया हुआ
done`
आईएफएस =
इको "$ योक" | जबकि लाइन 2 पढ़ें
कर
आईएफएस =
        इको "$ लाइन 2" | grep -v "1 2 3 4 5 6 7" | egrep -q "* 1 | * 1 $" | चलो wn ++
        [$ $ -n $ wn] && {\
                [$ i1 -eq $ {# team1 [@]} - 1] && i1 = 0 || आइ 1 + ++;
                [$ i2 -eq $ {# team2 [@]} - 1] && i2 = 0 || चलो i2 ++; }
        Printf '% 2s% s;% s;% s \ n' $ wn $ लाइन 2 $ {team1 [$ i1]} $ {team2 [$ i2]}
        खुद = $ wn
किया हुआ

क्षमा करें, कोड थोड़ा गंदा है ... और कोई टिप्पणी नहीं ... लेकिन यह अच्छी तरह से काम करता है;)


0

मैं वास्तव में स्थापित नहीं करना चाहता gcal, और मुझे अपने सिस्टम पर ठीक से काम करने के लिए नहीं मिला। तो बिना गोकल के, कवक का जवाब वास्तव में सबसे अच्छा समाधान है। मैंने इसे थोड़ा बदल दिया ताकि यह कमांड का उपयोग करके फॉर्मेटिंग जैसे दिन के हाइलाइट्स , रंगों आदि को भी संरक्षित करे script। मैंने निरर्थक पात्रों को भी हटा दिया, जिससे यह एक उपनाम के रूप में उपयुक्त हो गया, जैसे:

alias today="paste -d' ' <((echo ' '{,};ncal -w|tail -1)|fold -w3) <(script /dev/null -qc cal)"

या calएक नए फ़ंक्शन के साथ बदलें । हालाँकि, इसके साथ आप ऐसा नहीं कर सकते हैं cal -3। आपको सही सप्ताह मिलते हैं लेकिन वे ठीक से संरेखित नहीं होते हैं। एक सरल लेकिन पूर्ण समाधान यह जांचने के लिए है कि calक्या बिना तर्क के बुलाया जाता है, जैसे:

function cal {
    if [[ $# -eq 0 ]]; then
        paste -d' ' <((echo ' '{,};ncal -w $@|tail -1)|fold -w3) <(script /dev/null -qc "cal $@")
    else
        /usr/bin/cal "$@"
    fi
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.