日付から曜日を求めるワンライナーを awkで
ウェブサイトにイベントの告知記事を書くときに、過去の記事を書き換えて流用しようとすると、日付は書き換えたけど曜日を書き換え忘れていたり、あるいは間違えて書いてしまったり、ということがあります。そういう間違いをチェックするのに日付とカレンダーを付き合わせても良いのだけれど、どうせなら何かのロジックで処理したい。
さて、曜日の計算を汎用的に行うにはツェラーの公式を使うのが基本ですけど、それだと処理が冗長になります。そんなことをせずとも、指定した日付に対応する曜日を取得する処理をカレンダー関連のコマンドや関数で取得する方がシンプルです。
そこで awk で日付文字列をパースしつつ、mktimeで内部形式(unix秒)に変換したのち、strftime で曜日だけ取得するように書いてみました。
awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'
そうするとこんなふうに利用できます。
$ echo 2017/05/18 | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }' Thu $ echo '2017年5月18日' | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }' Thu $ awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }' 2017年 5月 18日 Thu 2017/5/18 Thu
日本語で表示してほしいなら LANG=ja_JP.UTF8 しておけばOKですね。
$ export LANG=ja_JP.UTF8 $ echo 2017/05/18 | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }' 木