এনসিএল বা সিএল ব্যবহার করে নির্দিষ্ট ফর্ম্যাটে সপ্তাহের নম্বর প্রদর্শিত হচ্ছে


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


সম্পাদনা: তবে এটি ভুল! আমি কেবল লক্ষ্য করেছি যে জানুয়ারীর প্রথম সপ্তাহে 52 বা 53 নম্বর হতে পারে! সুতরাং আমাদের কেবল হয় জানুয়ারীর জন্য একটি ব্যতিক্রম করতে হবে, বা কেবল সমস্ত সপ্তাহের সংখ্যাগুলি থেকে বের করতে হবে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 থেকে হবে।
নিখিল মুলি

cal 02 2012, এটি কি এই ব্যর্থ হবে ??
নিখিল মুলি

@ নিখিল: আপনার অর্থ কী তা আমি বুঝতে পারি না। আপনি কি আরও গভীরতার সাথে এটি ব্যাখ্যা করার চেষ্টা করতে পারেন? স্ক্রিপ্টটি কি ব্যর্থ হয় cal 02 2012? এটা আমার পরীক্ষায় কাজ করেছে বলে মনে হয়েছিল।
বিরে

@ নিখিল: আহ, ঠিক আছে। আমি প্রশ্নটি ভুল বুঝেছি। এর অর্থ হ'ল পরম সপ্তাহের সংখ্যা এবং প্রতি মাসের সাথে তুলনামূলক নয়। আমি আমার ভুল উত্তরটি কিছুক্ষণের মধ্যে মুছে ফেলব।
বিরিরে

1
শীতল..উত্তরটি মুছবেন না, দয়া করে রেফারেন্সের জন্য এটি রাখুন।
নিখিল মুলি

1

এসএমএল দ্বারা উত্তরে মন্তব্য করার জন্য পর্যাপ্ত প্রতিনিধি ছাড়া , ম্যাক ওএস ব্যবহার করে জিসিএল ইনস্টল করা যেতে পারে brew install gcal

(আমি প্রথমে উত্তরটি এখানে খুঁজে পেয়েছি, তারপরে এই উত্তরটি আলাদা জিজ্ঞাসা করুন, তবে ইউনিক্স উত্তরে ম্যাকে ইনস্টল করার জন্য আমার প্রয়োজনীয় সমস্ত তথ্যের অভাব রয়েছে))


0

এখানে আমার সমাধানটি কোডে সংক্ষিপ্ত এবং চলতি মাসের চেয়ে অন্যান্য তারিখের জন্য সূক্ষ্মভাবে কাজ করে। মার্কিন জনগণের জন্য দুঃখিত, এটি আইএসও ফর্ম্যাট ব্যবহার করে, অর্থাৎ সপ্তাহের প্রথম দিন সোমবার। এটি Cal এর জন্য -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
করা
IFS =
        cal -m $ m $ y | egrep -v "Mo | ^ $" | লাইন পড়ার সময়
        করা
                প্রতিধ্বনি $ লাইন | গ্রেপ-কি $ y && mname = $ লাইন || মুদ্রণ $ এমনেম $ লাইন | সেড 's /' $ y '//'
        সম্পন্ন
done`
IFS =
প্রতিধ্বনি "$ ycal" | লাইন 2 পড়ার সময়
করা
IFS =
        প্রতিধ্বনি "$ লাইন 2" | গ্রেপ-ভি "1 2 3 4 5 6 7" | egrep -q "* 1 | * 1 $" || চলুন wn ++
        [$ নিজস্ব-$ ডাব্লুএনএন] && {
                [$ i1 -eq $ {# টিম 1 [@]} - 1] && i1 = 0 || আই 1 ++; let
                [$ i2 -eq $ {# টিম 2 [@]} - 1] && i2 = 0 || আই 2 ++ দিন; }
        printf '% 2s% s;% s;% s s n' $ wn $ line2 $ {Team1 [$ i1]} $ {Team2 [$ i2]}
        মালিক = $ WN
সম্পন্ন

দুঃখিত, কিছুটা কদর্য কোড ... এবং কোনও মন্তব্য নেই ... তবে এটি ভালভাবে কাজ করে;)


0

আমি সত্যিই ইনস্টল gcalকরতে চাই না এবং এটি আমার সিস্টেমে সঠিকভাবে কাজ করতে পারি না। সুতরাং 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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.