• ベストアンサー

土曜日の日付を連続して出力するスクリプト?

カレンダーの「土曜日の日付」だけ計算して連続に出力するスクリプトは作れないでしょうか? (できれば bash で。awk, perl でもいいです。) たとえばこんな感じです 1: 5/1 2: 5/8 3: 5/15 4: 5/22 5: 5/29 6: 6/5 7: 6/12 ・・・ ↓考えてみましたが、だめです。 for cnt in `seq 1 50`; do   echo $cnt : ここに日付を出力したい done

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.5

#4です。ちょっとまずかったようです。 linuxでやってみましたが、存在しない日2004-6-31はエラーにならず、2004-7-1の曜日を返してしまいます。たまたま土曜日だとそう言う日が今年は無いようですが、#3のスクリプトで、SatをThuに変えて木曜日を求めると6/31も表示されてしまいます。 日付けが正しいかのチェックも追加しないといけません。 cnt=0 for m in 5 6 7 8 9 10 11 12 do for d in `seq 1 31`   do x=`date -d 2004-$m-$d +%a`    y='date -d 2004-$m-$d +%d`    if test "$x" = Sat -a "$y" -eq $d    then cnt=$(($cnt+1))       echo $cnt:$m/$d    fi   done done OSによっては2004-6-31がエラーになるかも知れず、その場合は#3の物で良いと思います。 >1) 「+ %a 2」はどういう働きをしているのでしょうか? +%a は曜日を英字3文字で表示します。+%d は日を表示します。man date に載ってます。 2>/dev/null はエラーメッセージをnullデバイスに書き込む(捨てる)と言うことです。これは man bash 。 >(2) cnt=$(($cnt+1)) は、なぜ二重括弧なのでしょうか? >  たしかに、一重括弧にしてみたらダメだったのですが、理由が分かりませんでした・・・ bashがそういう文法だからとしか言いようがありません。一重括弧 $( ) には別の意味があります。他には、 cnt=`expr $cnt + 1` という書き方も有ります。

white-tiger
質問者

お礼

本当ですね。全く気づきませんでした。 ありがとうございます!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

手元に環境が無いので実行して確認できませんが、今年の5月から12月までを求めるとして、こんな感じ。 cnt=0 for m in 5 6 7 8 9 10 11 12 do for d in `seq 1 31`   do x=`date -d 2004-$m-$d +%a 2>/dev/null`    if test "$x" = Sat    then cnt=$(($cnt+1))       echo $cnt:$m/$d    fi   done done 存在しない日2004-6-31とかの場合は、date がエラーになってエラーメッセージが /dev/null に捨てられて x は空になると思うので、大丈夫だと思います。

white-tiger
質問者

お礼

すごい、完璧です!! ありがとうございます! 2つだけ質問があるのですが、できればお願いします。 (1) 「+ %a 2」はどういう働きをしているのでしょうか? (2) cnt=$(($cnt+1)) は、なぜ二重括弧なのでしょうか?   たしかに、一重括弧にしてみたらダメだったのですが、理由が分かりませんでした・・・

すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

土曜日はいつからの日付のものを表示したいのでしょうか。 例えば2004年1月1日以降の1年間の土曜日の日付を表示する場合は、以下のようにします。(perlです) # 2004年1月1日以降の1年間の土曜日を表示 use Time::Local; #2004/1/1以降の最初の土曜日を見つける $time = timelocal(0,0,0,1,0,2004); #2004/1/1 while(1){ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); # $wday=6の時が土曜日の日 if ($wday == 6) { last; } $time += 24*60*60; #1日を加算 } while(1){ printf("%02d/%02d\n",$mon+1,$mday); #1週間を加算 $time += 7*24*60*60; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); if ($year+1900 != 2004) { last; } }

white-tiger
質問者

お礼

ありがとうございます。ここまで細かい情報もあつかえるのですね。参考になります。

すると、全ての回答が全文表示されます。
  • chupark
  • ベストアンサー率41% (90/218)
回答No.2

私はもっぱらWindows環境ばかりでUNIXは全くわからないのですが…。 以前にperlでCGIを作るときに曜日計算について調べたことがあるのですが、ツェラーの公式という曜日計算公式があるということを知りました。 #-------------------------------------------------------------- # $wday = &zeller($y,$m,$d); # Zeller(ツェラー)の公式による曜日計算 #-------------------------------------------------------------- sub zeller{ my($yy,$mm,$dd)=@_; my($wday); if ($mm == 1 || $mm == 2){ $yy--; $mm += 12; } $wday = ($yy + int($yy/4) - int($yy/100) + int($yy/400) + int(2.6*$mm+1.6) + $dd) % 7; #$WeekDay = ('日','月','火','水','木','金','土')[$wday]; return $wday; } 日付を繰り返し処理でこれにくぐらせて土曜日が戻ったときだけ出力…というパターンで実現できないでしょうか?

white-tiger
質問者

お礼

ありがとうございます。勉強になります。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.1

エクセルを使える環境で、エクセルVBAでよければ Sub test01() j = 1 n = DateSerial(2004, 1, 1) 'MsgBox Format(n, "0000000") For i = n To n + 365 If Weekday(i) = 7 Then Cells(j, 1) = i j = j + 1 End If Next i End Sub で、ワークシートに結果が出て、一部は ・・・ 2004/5/1 2004/5/8 2004/5/15 2004/5/22 2004/5/29 2004/6/5 2004/6/12 2004/6/19 2004/6/26 ・・・ になります。 A列の書式を日付けにしておきます。1年分です。

white-tiger
質問者

お礼

残念ながら私の環境はUNIXです。 きちんと書かずにすみません。

すると、全ての回答が全文表示されます。

関連するQ&A