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


10

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

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

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

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


2
더 이상 사용되지 않는 백틱 대신 $ (...)를 사용하십시오. 그들은 쉽게 중첩 될 수 있습니다.
사용자가 알 수 없음

1
궁금한 점이 있습니다. 다른 답변이 4를 제수로 사용하는 이유.
LiuYan 刘 研

2
@LiuYan 刘 研 : 확실하지 않습니다. 분기에 3 개월이 있으므로 3이 올바른 제수라고 생각합니다. (처음에는 저도 혼란
스러웠지만

9 월에 %m제공 09이라는 오류가 발생합니다 그래서 bash는 시도는 인해 선도 0 진수로 해석한다 09: value too great for base (error token is "09"). 로 변경 %m하여 0 패딩을 비활성화하면이 문제를 해결할 수 있습니다 %-m.
Matthew

5

dateutils를 사용하십시오 .

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

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


dconv now -f%Y%Q | tr Q q그 Q를 소문자로 사용해야하는 경우. (PS : 우리는 이것을 " date대신에 접두사로 페도라로 패키징하고 있습니다."ddateconv
mattdm

5

예를 들어 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

1
+1 "실패로 나눈 모든 솔루션" 네가 옳아! 분기는 3 개월 동안 지속되므로 답은 3
Stephen 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"

멋있는. 첫 번째 날짜 / awk 줄을 좋아합니다 date. 두 번 호출하고 매개 변수를 전달하지 않기 때문 입니다.
smokris

4

날짜를 사용하여 형식을 분할하고 awk로 계산하고 printf를 사용하여 형식을 지정하십시오.

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

그냥 날짜와 배쉬 :

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

첫 번째 라인 2012q0이 잘못 출력 됩니다.
smokris

@ 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. $ (unix-cmd)-쉘 스크립트에서 명령을 평가합니다
  2. $ ((expr))-수학 표현식을 평가합니다
  3. 다시 매핑 1..12-> 1..4는 다음 수학 (m-1) / 3 + 1을 사용합니다.
  4. 전월을 평가하는 데는 모듈로 수학

2

이제이 %q정보를 표시 하는 형식이 있습니다.

2016 년 11 월 30 일 의 coreutils-8.26 릴리스 로그 에서 :

새로운 기능
...
날짜는 이제 연중 분기를 출력하기 위해 % q 형식을 허용합니다.

그리고 그렇습니다!

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

0

ISO 주 달력을 기반으로 한 13 주 회계 분기 를 원한다면, 새로운 편리한 % q는 슬프게도 작동하지 않습니다. 다음은 awk / strftime이 포함 된 @manatwork의 날짜없는 솔루션 버전입니다.

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

마지막 작은 3 진 비트는 지난 분기가 14 주인 ISO 윤년을 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.