কমান্ড লাইন থেকে কীভাবে এক বছর-কোয়ার্টার তারিখ তৈরি করা যায়?


10

আমি চলতি বছরের-প্রান্তিকের পাশাপাশি পূর্ববর্তী মাসে বছরের কোয়ার্টারের উপস্থাপনে আগ্রহী।

আজ যদি ২০১২ সালের জানুয়ারী হয়, আমি পেতে চাই

2012q1

এবং

2011q4

সম্পর্কিত আউটপুট হিসাবে।

উত্তর:


10

BASH পাটিগণিত মূল্যায়ন এবং GNU dateকমান্ড ব্যবহার করে একটি (কান্ডা কুরুচিপূর্ণ) সমাধান :

echo $(date +%Y)q$(( ($(date +%-m)-1)/3+1 ))
echo $(date -d "-1 month" +%Y)q$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))

নোট করুন যে 0-প্যাডিং থেকে %-mপ্রতিরোধ করে date, তাই এটি এখনও আগস্ট এবং সেপ্টেম্বরের জন্য কাজ করবে।


2
অবহিত ব্যাকটিকগুলির পরিবর্তে $ (...) নিন। তারা সহজেই বাসা বাঁধতে পারে।
ব্যবহারকারীর অজানা

1
শুধু কৌতূহলী হোন: কেন অন্য উত্তর 4 টি বিভাজক হিসাবে ব্যবহার করে।
লিউইয়ান 研

2
@ লিউইয়ান 刘 研: নিশ্চিত নন এক চতুর্থাংশে 3 মাস রয়েছে, তাই আমি মনে করি 3 টি সঠিক বিভাজক। (যদিও এটি প্রথমে আমাকেও বিভ্রান্ত করেছে))
ধূমপায়ী

সেপ্টেম্বর মাসে %mদেয় 09যা ব্যাশ চেষ্টা শীর্ষস্থানীয় 0 কারণে অকট্যাল হিসাবে ব্যাখ্যা তাই এটিকে ত্রুটি বলে ছোঁড়ার 09: value too great for base (error token is "09")। এই পরিবর্তন করে 0-প্যাডিং অক্ষম করার মাধ্যমে সংশোধন করা যেতে পারে %mথেকে %-m
ম্যাথু

5

আমার তারিখ ব্যবহার করুন :

dconv 2012-01-01 -f '%Y%Q'
=>
  2012Q1

%qএবং %Qপতাকা dateutils নির্দিষ্ট আছে, এবং সংখ্যা হিসাবে অথবা আকারে কোয়ার্টার আসতে Q<NUMBER>


dconv now -f%Y%Q | tr Q qআপনার যদি সত্যিই প্রয়োজন হয় তবে Q কে লোয়ার কেসড করা উচিত। (পিএস: আমরা dateddateconv
ফেডোরায় এটির

5

চারটি দ্বারা বিভক্ত সমস্ত সমাধান ব্যর্থ হয়, উদাহরণস্বরূপ নভেম্বর:

% echo $(( 11/4+1 ))
3

সঠিক গণিতটি হ'ল:

$(( (m-1)/3 +1 ))

এবং এর মতো, বর্তমান এবং পূর্বের মাসের চতুর্থাংশটি হবে:

echo curr ${y}q$(((m-1)/3+1))
if [ $m = 1 ]; then
  echo prev $((y-1))q4
else
  echo prev ${y}q$(((m-2)/3+1))
fi

এটি যাচাই করা কেবল বারোটি মান, সত্যই…

% for m in {1..12}; do echo $m Q$(((m-1)/3+1)); done
1 Q1
2 Q1
3 Q1
4 Q2
5 Q2
6 Q2
7 Q3
8 Q3
9 Q3
10 Q4
11 Q4
12 Q4

1
+1 "সমস্ত সমাধান যা ব্যর্থতার দ্বারা ভাগ হয়" For তুমি ঠিক বলছো! 3 মাসের জন্য একটি মহল গত তাই উত্তর 3. দ্বারা বিভাজক হবে
স্টিফেন, Quan

4

সম্ভবত, সরাসরি কোনও সমাধান নেই।

আপনি awkএতগুলি ব্যাক-টিক এড়ানোর জন্য ব্যবহার করতে পারেন ।

date +"%Y %m" | awk '{q=int($2/4)+1; printf("%sq%s\n", $1, q);}'
date +"%Y %m" | awk '{q=int($2/4);y=$1;if (q==0){q=4;y=y-1;}; printf("%sq%s\n", y, q);}'

একটি perlসমাধান ক্লিনার কিন্তু হবে perlএবং DateTimeএকটি ভারী পূর্বশর্ত আছে।

#!/usr/bin/perl

use DateTime;

my $today = DateTime->now;
print "today: " . $today->year . "q" . $today->quarter . "\n";

my $ago = DateTime->now->subtract( months=> 4);
print "some time ago: " . $ago->year . "q" . $ago->quarter . "\n"

কুল। আমি প্রথম তারিখ / অ্যাজক লাইনটি পছন্দ করি, কারণ এটি কল করা (এবং প্যারামিটারগুলিতে) dateদুটি বার এড়িয়ে চলেন ।
স্মোক্রিস

4

তারিখের সাথে ফর্ম্যাটটি বিভক্ত করুন, awk দিয়ে গণনা করুন, প্রিন্টফের সাথে ফর্ম্যাট করুন:

date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'

ঠিক তারিখ এবং বাশ:

echo $(date +%Yq)$(($(date +%m)/4+1))

প্রথম লাইন আউটপুট 2012q0যা ভুল।
স্মোক্রিস

@ স্মোক্রিস: আপনি ঠিক বলেছেন - আমি আমার পরীক্ষার ভুল লাইনটি বেছে নিয়েছি।
ব্যবহারকারী অজানা

4

একটি বিকল্প, আরও কৌতূহল হিসাবে। যদি জিএনইউ awkজড়িত থাকে তবে এটির dateপ্রয়োজন হয় না:

awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'

3

dateবর্তমান বছর এবং মাস পুনরুদ্ধার করার জন্য কল করুন এবং শেলগুলিতে পাটিগণিত দিয়ে বাকীটি করুন।

set $(date '+%Y %m');
this_quarter=${1}q$(($2 / 4 + 1))
if [ $2 -eq 1 ]; then
  last_month_quarter=$(($1 - 1))q4
else
  last_month_quarter=${1}q$((($2 - 1) / 4 + 1))
fi

2

এই মাসের জন্য বছরের কোয়ার্টার

date +"%Yq$(expr $(expr $(date +%m) - 1) / 3 + 1)"

হ্যাটার-মাসের জন্য বছরের কোয়ার্টার

date +"%Yq$(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)"

2

এই ত্রৈমাসিকের জন্য এবং গত মাসের কোয়ার্টারের জন্য বেসিক গণিত:

y1=$(date +%Y)
m1=$(date +%m)
q1=$(( (m1 - 1) / 3 + 1))
y2=$(( y1 - (m1 == 1) ))
m2=$(( (m1 + 10) % 12 + 1 ))
q2=$(( (m2 - 1) / 3 + 1 ))
echo This Quarter: $((y1))q$q1
echo Last Month Quarter: $((y2))q$q2

স্ক্রিপ্টটি নিম্নলিখিত অংশগুলি ব্যবহার করে:

  1. $ (unix-cmd) - শেল স্ক্রিপ্টের একটি কমান্ড মূল্যায়ন করে ates
  2. $ ((এক্সপ্রেস)) - একটি গাণিতিক এক্সপ্রেশন মূল্যায়ন
  3. রিম্যাপিং ১.১২ -> ১.৪ নীচের গণিতটি ব্যবহার করে (মি -1) / 3 + 1
  4. আগের মাসের মূল্যায়ণে মডুলো ম্যাথ ব্যবহার করা হয়

2

%qএই তথ্যটি দেখানোর জন্য এখন ফর্ম্যাট রয়েছে।

থেকে coreutils-8.26 রিলিজ লগ নভেম্বর 30, 2016 থেকে:

নতুন বৈশিষ্ট্য
...
তারিখটি এখন বছরের কোয়ার্টারে আউটপুট করতে% কিউ ফর্ম্যাটটি গ্রহণ করে।

এবং হ্যাঁ এটি কাজ করে!

$ date "+%q"
4
$ date "+%Yq%q"
2016q4

0

আপনি যদি চান রাজস্ব 13 সপ্তাহ কোয়ার্টার যে আইএসও সপ্তাহে ক্যালেন্ডার উপর ভিত্তি করে এর, তারপরে নতুন কুশলী% কুই কাজ দুঃখিতভাবে যাচ্ছে না। অ্যাডাব্লু / স্ট্রফটাইম সহ @ মান্যাটওয়ার্কের অবিরাম সমাধানের একটি সংস্করণ এখানে।

awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'

সর্বশেষ সামান্য ত্রৈমাসিক বিট আইএসও লিপ-সপ্তাহের বছরগুলি পরিচালনা করে যেখানে শেষ প্রান্তিকে 14 সপ্তাহ রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.