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