커맨드 라인에서 분기 별 날짜를 생성하는 방법은 무엇입니까? 연도 및 전월의

나는 현재 연도 및 전월의 분기를 표현하는 데 관심이 있습니다.

오늘이 2012 년 1 월 1 일인 경우

2012q1

2011q4

각 출력으로.



답변

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 ))

점을 유의 %-m방지 date0 패딩에서,이 때문에 여전히 8 월과 9 월 작동합니다.


답변

dateutils를 사용하십시오 .

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

%q%Q플래그는 dateutils 특정이며, 숫자 또는 형태로 분기를 반환 Q<NUMBER>.


답변

예를 들어 11 월과 같이 4로 나눈 모든 솔루션은 실패합니다.

% 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

확인해야 할 값은 12 가지뿐입니다.

% 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


답변

아마도 직접적인 해결책은 없을 것입니다.

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로 계산하고 printf를 사용하여 형식을 지정하십시오.

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

그냥 날짜와 배쉬 :

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


답변

호기심에 대한 대안. GNU awk가 관련된 경우 date필요하지 않습니다.

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


답변

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