(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux】カレンダーから任意の曜日の日付を取得するワンライナー

スポンサーリンク

はじめに

以下記事ではUNIX系OSにて一連の日付を「yyyymmdd」形式で出力するワンライナーを解説しました。

本記事ではそこに条件を加えて第二土曜日(カレンダーにおいてその月の2回目の土曜日)を取得するワンライナーを説明します。

コマンド実行状況
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ date --version
date (GNU coreutils) 8.26

ワンライナー

$ seq 0 365 | sed 's/^/20200101 /' | sed 's/$/ days/' | date -f - '+%Y%m%d %w' | awk '/6$/{print $1}' | awk '++x[substr($0,0,6)]==2'

結果は以下

20200111
20200208
20200314
20200411
20200509
20200613
20200711
20200808
20200912
20201010
20201114
20201212

以下、補足です。

補足

dateコマンドの-d "XXXXXXXX 1 days"の記法によって指定日から任意の日付だけずらして表示するオプションを利用し、そこに%wを付与して曜日情報を書き出します。

cronのルールと同じく、日曜日が0から始まり土曜日は6で終わるので末尾が6で終わる行の1列目を取り出します。

awk '/6$/{print $1}' 

あとは先頭の6文字で連想配列を行うことで月毎に集計し、2番目の出現回数を以下で出力すれば

awk '++x[substr($0,0,6)]==2'

第二土曜日が取得できます。

以上、ご参考になれば幸いです。