Bash에서 cal 함수를 사용하여 "첫 번째" 날짜를 선택하세요.

Bash에서 cal 함수를 사용하여 "첫 번째" 날짜를 선택하세요.

cal함수와 파이프 명령 awk에서 첫 번째 월요일, 두 번째 화요일, 두 번째 토요일 등을 선택 하려고 합니다 . 이번 달에는 받을 수 있어요첫 번째 화요일다음 달력 명령을 올바르게 사용하십시오.

    December 2018
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

>cal | awk 'NF == 7 && NR > 2 {print $3; exit}'
>4

하지만 이것이 항상 작동하는 것은 아닙니다. 아래 2016년 3월의 테스트를 참조하세요.

     March 2016
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

>cal 3 2016 | awk 'NF == 7 && NR > 2 {print $3; exit}'
>8

위쪽 예제에서는 작동하지만 아래쪽 예제에서는 작동하지 않는 이유는 무엇입니까? 제 생각에는 아래의 예는 세 번째 행을 보고 올바른 결과를 찾아야 한다고 생각합니다 1. 제가 사용할 수 있는 확실한 방법이 있습니까 awk? 열이 비어 있는지 확인하고 다음 행으로 이동하여 이 날짜를 얻을 수 있습니까?

답변1

여기 당신을 위한 또 다른 해결책이 있습니다

cal | awk 'NR >= 3 { tu = substr($0,7,2) +0 } tu { print tu; exit }'
4

cal 3 2016 | awk 'NR >= 3 { tu = substr($0,7,2) +0 } tu { print tu; exit }'
1

화요일 열(문자 7 및 8)을 선택하고 0이 아닌 첫 번째 값을 제공합니다. 이 방법은 어떤 요일에도 안전하게 추정할 수 있습니다.

답변2

GNU 날짜를 사용하세요:

매월 첫째 화요일:

for day in 0{1..7}; do [[ "$(date -d $(date +%Y%m${day}) +%a)" = "Tue" ]] && echo "$day";done

해당 연도 및 월의 첫 번째 화요일:

year=2016
month=03
for day in 0{1..7}; do [[ "$(date -d ${year}${month}${day} +%a)" = "Tue" ]] && echo "$day";done

awk의 "화요일" 변형:

cal | awk -F "" '!/[[:alpha:]]/ && $7$8 ~ /[0-9]/ { print $7$8;exit }'

그러면 문자(제목 OK)가 포함된 줄을 건너뛰기 전에 열 7과 8(화요일)의 하드 코딩된 위치에 대한 출력을 확인합니다(필드 구분 기호가 비어 있고 입력이 각 문자로 분할됨). 다른 날짜를 얻으려면 7과 8을 조정하세요.

이전 명령이 수행한 작업을 보다 명확하게 표시하기 위해 awk 명령의 필드는 열별로 번호가 매겨져 있습니다.

123456789            <--- awk fields $1, $2, $3, ... $9
    December 2018
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

답변3

gcal(GNU) 및 (BSD) 시리즈는 모두 ncal행과 열을 바꾸는 옵션을 지원합니다.

$ ncal
    March 2024        
Su     3 10 17 24 31
Mo     4 11 18 25   
Tu     5 12 19 26   
We     6 13 20 27   
Th     7 14 21 28   
Fr  1  8 15 22 29   
Sa  2  9 16 23 30   

$ gcal -i

March 2024

Sunday          3 10 17 24 31
Monday          4 11 18 25   
Tuesday         5 12 19 26   
Wednesday       6 13 20 27   
Thursday        7 14 21 28   
Friday       1  8 15 22 29   
Saturday     2  9 16 23 30   

이렇게 호출하면 요일별로 순차적인 위치를 선택하기가 더 쉽습니다. 먼저 awk원하는 요일과 일치하는 패턴을 사용한 다음 N-1 열을 인쇄하여 해당 요일의 N번째 인스턴스를 가져옵니다.

예를 들어 특정 월 및 연도의 첫 번째 화요일은 다음과 같습니다.

$ ncal 12 2018 | awk '/^Tu/ { print $2; }'
4
$ ncal 3 2016 | awk '/^Tu/ { print $2; }'
1

매월 5번째 금요일을 얻으려면(정확히 하나의 금요일이 있습니다):

$ ncal | awk '/^Fr/ { print $6; }’
29

답변4

ksh93에서:

$ printf '%(%F)T\n' 'first monday this month'
2024-03-04
$ printf '%(%F)T\n' 'second tuesday this month'
2024-03-12
$ printf '%(%F)T\n' '2nd tuesday in 2016-03'
2016-03-08

(알아채다4번째와 5번째는 현재 ksh93u+m 버전에서는 작동하지 않습니다.; 그럼에도 불구 fourth하고 fifth).

관련 정보