次のように、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