cal
スクリプトまたはHTMLを使用してExcelで使用できるように、以下の日付と曜日を1行で出力する作業コマンドを試しています。以下の通りです。
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
短縮された平日に設定され、無効な日付の平日を取得しようとすると終了します。
2番目のループは、埋める必要がある月数だけ整数だけを印刷します。
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
(しかし参考にしてください剣少なくとも私のシステムでは、2文字の労働日の略語を使用します)
答え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))
)。