2つの日付の間に予想される形式で日付を出力する

2つの日付の間に予想される形式で日付を出力する

日付出力形式を次のようにしたい...

01/01/2020
02/01/2020
03/01/2020
04/01/2020
05/01/2020
06/01/2020
07/01/2020
08/01/2020
09/01/2020
10/01/2020
11/01/2020
12/01/2020
13/01/2020
14/01/2020
15/01/2020
16/01/2020
17/01/2020
18/01/2020
19/01/2020
20/01/2020
21/01/2020
22/01/2020
23/01/2020
24/01/2020
25/01/2020
26/01/2020
27/01/2020
28/01/2020
29/01/2020
30/01/2020

現在私が使用しています...

cal 01 2020 | grep -v "[A-Z][a-z]"| tr ' ' '\n' | sort -n | awk '$1~/[0-9]/ { printf "%02s/%02s/%4s\n",$1,"01","2020"}'

01/01/2017上記の形式が必要です31/12/2019。私は何をすべきですか?

答え1

#!/bin/bash

timestamp=$( date -d '2017-01-01 12:00' +%s )

while [ "$thedate" != '31/12/2019' ]; do
        printf -v thedate '%(%d/%m/%Y)T' "$timestamp"
        timestamp=$(( timestamp + 86400 ))

        printf '%s\n' "$thedate"
done

上記のスクリプトは、まずGNUを使用してdate開始日の正午(1483268400)のUNIXタイムスタンプを取得します。その後、終了日を見つけて出力するまで繰り返します。繰り返しごとにtimestamp86400秒(24時間)を追加します。

printfbash日付文字列は、その形式を使用してUNIXタイムスタンプで日付と時刻の文字列をフォーマットすることができる組み込みユーティリティを使用して生成されます(この場合はバージョン4.3以降が%(...)T必要です)。また、を使用して変数bashに直接印刷します。 thedate-v

GNUを持たない一部のシステムでは、コマンドライン引数の代替形式を使用する基本ユーティリティを使用して、開始日のタイムスタンプを取得dateできます。dateたとえば、OpenBSDでは次のようになります。

date -j +%s 201701011200

man date特定のUnixを確認してください。

awkいくつかの拡張も利用可能です。

awk 'BEGIN { print mktime("2017 01 01 12 00 00") }'

awkただし、これが(GNUawk程度)ある場合は、mawk次のすべてを実行することをお勧めしますawk

awk '
BEGIN {
        timestamp = mktime("2017 01 01 12 00 00")

        while (thedate != "31/12/2019") {
                thedate = strftime("%d/%m/%Y", timestamp)
                timestamp += 86400

                print thedate
        }
}'

答え2

現在の年と来月の最初の繰り返しを含む入れ子になったforループを追加する必要があります。各月に対してすでに行った操作を実行して、awkの最後に月と年を印刷します。

関連情報