कमांड लाइन से एक साल की तिमाही की तारीख कैसे उत्पन्न करें?


10

मैं वर्तमान वर्ष-तिमाही के प्रतिनिधित्व के साथ-साथ पिछले महीने के लिए वर्ष-तिमाही के उत्पादन में रुचि रखता हूं।

अगर आज पहली जनवरी 2012 है, तो मैं प्राप्त करना चाहता हूं

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
@ लियुआन 刘 an: निश्चित नहीं है। एक तिमाही में 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 को कम आवरण वाला होना चाहिए। (पुनश्च: हम dateइसके बजाय उपसर्ग के रूप में फेडोरा में पैकेजिंग कर रहे हैं d, इसलिए " dateconv"।)
2836 पर mattdm

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 के लिए "सभी समाधान जो असफलता के लिए विभाजित होते हैं"। आप सही हे! एक तिमाही 3 महीने तक चलती है, इसलिए जवाबों को 3 से विभाजित किया जाना चाहिए
स्टीफन क्वान

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"

ठंडा। मुझे पहली तारीख / awk लाइन पसंद है, क्योंकि यह dateदो बार कॉलिंग (और पासिंग पैरामीटर) से बचा जाता है ।
धूम्रपान करने वालों

4

तारीख के साथ प्रारूप को विभाजित करें, awk के साथ गणना करें, प्रिंटफ के साथ प्रारूप:

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

बस तारीख और बैश:

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

पहली पंक्ति आउटपुट 2012q0जो गलत है।
धूम्रपान करने वाले

@smokris: आप सही हैं - मैंने अपने परीक्षणों की गलत लाइन को चुना।
उपयोगकर्ता अज्ञात

4

एक विकल्प, एक जिज्ञासा के रूप में अधिक। यदि GNU 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. $ (यूनिक्स- cmd) - शेल स्क्रिप्ट में एक कमांड का मूल्यांकन करता है
  2. $ ((expr)) - एक गणितीय अभिव्यक्ति का मूल्यांकन करता है
  3. 1..12 -> 1..4 का पुनरावर्तन निम्न गणित (एम -1) / 3 + 1 का उपयोग करता है
  4. पिछले महीने का मूल्यांकन मोडुलो गणित का उपयोग करता है

2

अब %qयह जानकारी दिखाने का प्रारूप है।

से coreutils-8.26 रिहाई लॉग 30 नवंबर 2016 से:

नई सुविधाएँ
...
तिथि अब वर्ष की तिमाही के उत्पादन के लिए% q प्रारूप को स्वीकार करती है।

और हाँ यह काम करता है!

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

0

यदि आप चाहते हैं कि वित्तीय 13-सप्ताह की तिमाही जो कि आईएसओ सप्ताह कैलेंडर पर आधारित है, तो नया काम% q दुख की बात नहीं है। यहाँ awk / strftime के साथ @ manatwork के डेटालेस समाधान का एक संस्करण है।

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

अंतिम छोटी टर्नरी बिट आईएसओ लीप-सप्ताह के वर्षों को संभालती है जहां अंतिम तिमाही में 14 सप्ताह होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.