新しい日付列を作成するには、毎週累計列を追加します。

新しい日付列を作成するには、毎週累計列を追加します。

次のように、100の日付(dd / mm / yyyy)を含むファイルがあります。

10112017
23012012
01022008

Bashから次の出力を取得するには、この日付に8週間を追加する必要があります。

10112017 05012018
23012012 19032012
01022008 28032008

それはおそらくawkかもしれませんし、pを読むときに始まるかもしれませんが、あなたが望む出力を得ることができないかもしれません。

助けてくれてありがとう。

答え1

Perlとモジュールを使用できますTime::Piece

perl -MTime::Piece -MTime::Seconds -lpe '
  $dt = Time::Piece->strptime($_,"%d%m%Y") + 8 * ONE_WEEK; 
  $_ .= $dt->strftime(" %d%m%Y")
' file
10112017 05012018
23012012 19032012
01022008 28032008

またはGNU awk(gawk)とGNUを使用してください。date

gawk -v FIELDWIDTHS='2 2 4' '{
    cmd = sprintf("date +%%d%%m%%Y -d \"%s/%s/%s + 8 weeks\"", $2, $1, $3); 
    cmd |& getline dt; 
    close(cmd)
  } 
  {
    print $0,dt
  }
' file
10112017 05012018
23012012 19032012
01022008 28032008

または(私が一番好きなもの)、ミラー

$ mlr --nidx put -S '$2 = strftime(strptime($1,"%d%m%Y") + 4838400,"%d%m%Y")' file
10112017 05012018
23012012 19032012
01022008 28032008

84838400週は秒単位です(3600 x 24 x 7 x 8)。

答え2

]# date -d '2020-2-1 +8 week' +%Y-%m-%d
2020-03-28

]# date -d '2019-2-1 +8 week' +%Y-%m-%d
2019-03-29

]# date -d '2019-7-1 +8 week' +%Y-%m-%d
2019-08-26

info dateいくつかの追加例があります。 DDMMYYYY形式では機能しないYYYY-MM-DD表記法を使用しました。

これはGNUですdate。この例では、月の長さとうるう年が有効であることを示しています。

dateデフォルトのカレンダー処理ツールが含まれています。おそらくこれをスクリプトに統合するより良い方法があるかもしれません。入力「DDMMYYYY」には(?)処理が必要であることが分かる。

出力形式を+%Y-%m-%dに変更できます+%d%m%Y

答え3

以下にコメント付きのbashスクリプト。次のように実行します./script.sh < inputfile > outputfile

#!/bin/bash

# date1 is orignal date string in 1st column
# date2 is 8 weeks later than date1

while read date1 ; do

    # Skip emtpy lines
    #
    [ "$date1" ] || continue

    # We want to use 'date' command to calculate 8 weeks later.
    # However the 'date' command does not accept 'ddmmyyyy', but it
    # does accept 'yyyy-mm-dd'. So we need to convert first.
    #
    dd=${date1%??????}
    mm=${date1#??} ; mm=${mm%????}
    yyyy=${date1#????}

    # The 'date' command does have its own option to specify output
    # format of the date. It also just lets specify the input date
    # like this: "1983-04-18 + 8 weeks" to have it calculate what we
    # need here.
    #
    date2=$(date -d "${yyyy}-${mm}-${dd} + 8 weeks" +'%d%m%Y')

    # Now just output both dates on one line
    #
    echo $date1 $date2

done

関連情報