cal
스크립트나 HTML을 사용하여 Excel에서 사용할 수 있도록 아래의 날짜와 요일을 한 줄로 출력하는 작업 명령을 시도하고 있습니다 . 아래와 같습니다.
Wed Thu Fri Sat Sun Mon Tue Wed
1 2 3 4 5 6 7 8
답변1
bash
(또는 ksh93
) 및 GNU를 사용하십시오 date
.
for (( i = 0; i < 8; ++i )); do
printf '%s\t' "$( date -d "now +$i days" +"%a" )"
done
echo
for (( i = 0; i < 8; ++i )); do
printf ' %d\t' "$( date -d "now +$i days" +"%e" )"
done
echo
이 %a
형식은 현재 로케일의 요일 약어를 제공하고 %e
해당 월의 날짜를 정수로 제공합니다.
결과(탭으로 구분):
Tue Wed Thu Fri Sat Sun Mon Tue
7 8 9 10 11 12 13 14
ksh93
댓글 후 업데이트:(참고: 쉘이 날짜를 올바르게 확인할 수 없는 것 같기 때문에 이 방법은 작동하지 않습니다.)
#!/bin/ksh93
yearmonth=$( date +"%Y%m" )
d=1
while printf '%(%a)T\t' "$( printf '%s%02d' "$yearmonth" "$d" )" 2>/dev/null
do
(( ++d ))
done
echo
days_this_month=$(( --d ))
while (( d > 0 )); do
printf ' %d\t' "$(( days_this_month - (--d) ))"
done
echo
yearmonth
먼저 형식을 현재 연도 및 월로 설정합니다 YYYYMM
. 그런 다음 해당 달의 모든 평일을 반복합니다. 루프는 wday
축약된 평일로 설정되며 유효하지 않은 날짜에 대한 평일을 얻으려고 하면 종료됩니다.
두 번째 루프는 채워야 하는 월 수만큼 정수만 인쇄합니다.
2017년 2월 출력:
Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue
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
ksh93
Perl과 Date::Calc를 사용한 솔루션:
#!/bin/ksh93
ym=( $(date +"%Y %m") )
days=$( perl -MDate::Calc -e 'print Date::Calc::Days_in_Month($ARGV[0],$ARGV[1])' -- "${ym[0]}" "${ym[1]}" )
for d in {1..$days}; do
printf '%(%a)T\t' "$( printf '%d-%d-%02d' "${ym[@]}" "$d" )"
done
echo
for d in {1..$days}; do
printf '%d\t' "$d"
done
echo
답변2
단독으로 사용 zsh
(내장된 경우에만):
#! /bin/zsh -
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s year %Y $now
strftime -s month %m $now
strftime -rs s %Y,%m,%d,%H $year,$month,1,12
output=()
while
for field (a d m) strftime -s $field %-$field $s
((month == m))
do
output+=($a $((d)))
((s += 86400))
done
print -C $(($#output / 2)) $output
단독으로 사용 bash
(4.2 이상)(내장만 가능) 단, 해당 로케일에서만 요일 약어가 3자 이하이고 전부 1바이트 문자로만 구성된다고 가정하므로 영어 이외의 언어에서는 제대로 작동하지 않습니다. 많은 로케일에서).
#! /bin/bash -
printf -v now '%(%s)T' -1
printf -v d '%(%-d)T' "$now"
printf -v h '%(%-H)T' "$now"
printf -v month '%(%-m)T' "$now"
s=$((now +(12-h)*3600 - (d-1) * 86400))
l1= l2=
while
for field in a d m; do printf -v "$field" "%(%-$field)T" "$s"; done
((month == m))
do
printf -v l1 '%s%-3s ' "$l1" "$a"
printf -v l2 '%s%-3s ' "$l2" "$d"
((s += 86400))
done
printf '%s\n' "$l1" "$l2"
답변3
또한칼출력은 다음과 같습니다.
>cal|sed -n '2p;/_/p'
Su Mo Tu We Th Fr Sa
5 6 7 8 9 10 11
(하지만 참고하세요칼적어도 내 시스템에서는 두 글자로 된 근무일 약어를 사용합니다)
답변4
$ cal | perl -0ne '
if(/(.*)(Su.*?)\n(\h*)( 1.*?)\s*$/s){
$s= length($3);
$b=$2 x 5;
$n= $4 =~ s/[^\d ]//gr;
print substr($b,$s,length($n)),"\n$n\n" }'
We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu
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
설명: cal의 출력은 정규식으로 나뉩니다.(.*)(Su.*?)\n(\h*)( 1.*?)
Febr 2017 \nSu Mo Tu We Th Fr Sa \n 1 2 3 4 \n 5 6 7 8 9 10 11 ...
($1 )($2 ) ($3 )($4 ... )
$2
주간 열을 작성하는 데 사용됩니다($b = $2 x 5
).$4
\n
문자( )를 제거하고 강조 표시한$n= $4 =~ s/[^\d ]//gr
후 날짜 목록을 작성하는 데 사용됩니다.- 의 길이는
$3
주 열에서 지난 달의 날짜를 제거하는 데 사용됩니다(substr($b,$s,length($n))
).