はじめに
Excelではセルに日付データを入力して1日足す演算を行い、ドラッグ&ドロップを行えばカレンダーに沿って日付が表示されます。そして表示形式を変更すれば自由な形式で取り出せます。
今回は同じような処理として、UNIX系OSにて一連の日付を「yyyymmdd」形式で出力するワンライナーを記載しました。
コマンド実行状況
$ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
$ date --version date (GNU coreutils) 8.26
seqとsedとdate
2018年12月30日から5日間の日付をyyyymmdd形式で出力しました。
$ seq 0 4 | sed 's/^/20181230 /' | sed 's/$/ days/' | date -f - '+%Y%m%d' 20181230 20181231 20190101 20190102 20190103
以下、補足です。
補足
dateコマンドの-d "XXXXXXXX 1 days"
の記法によって指定日から任意の日付だけずらして表示するオプションを利用します。
例えば以下のようになります。
$ date -d "20181230 1 days" '+%Y%m%d' 20181231
この引数部分をパイプで渡すために以下のオプションを使います。
-f, --file=DATEFILE
like --date; once for each line of DATEFILE
渡し方は標準入力からなので、コマンドとしては-f -
とします。以下がその例ですがechoの結果が引数になっています。
$ echo "20181230 1 days" | date -f - '+%Y%m%d' 20181231
上のワンライナーを知っていればあとは「起点の日付 X days」部分のXに「1,2,3,...」という数字を入れるべくsedコマンドを利用します。
$ seq 0 4 | sed 's/^/20181230 /' 20181230 0 20181230 1 20181230 2 20181230 3 20181230 4
「^」は先頭行を指すので頭に起点の日付をスペース付きで差し込んでいます。
$ seq 0 4 sed 's/^/20181230 /' | sed 's/$/ days/' 20181230 0 days 20181230 1 days 20181230 2 days 20181230 3 days 20181230 4 days
同じように行末を意味する「$」の後ろに「days」をスペース付きで差し込んでいます。
そして、再掲ですが以下が表題を実践するワンライナーです。
$ seq 0 5 | sed 's/^/20181230 /' | sed 's/$/ days/' | date -f - '+%Y%m%d' 20181230 20181231 20190101 20190102 20190103 20190104
この書き方は結構応用がきき、例えば2019年の各月の日数もワンライナーで出せます。
$ seq 0 364 | sed 's/^/20190101 /' | sed 's/$/ days/' | date -f - '+%Y%m' | uniq -c 31 201901 28 201902 31 201903 30 201904 31 201905 30 201906 31 201907 31 201908 30 201909 31 201910 30 201911 31 201912
終わりに
個人的には結構便利に使っているワンライナーですが、同様のことをサクッと行いたい方の参考になれば幸いです