日付を含むファイルがあります。
Mar 16
Mar 12
Mar 13
Mar 19
Mar 14
Mar 17
これまでに経過した日数を計算する必要があります。私はこの機能を持っています:
datediff() {
d1=$(date -d "$1" +%s);
d2=$(date -d "$2" +%s);
echo $(( (d1 - d2) / 86400 )) days;
}
$ datediff 'now' '13 Mar'
114 days
しかし、各行を計算するにはループが必要です。
ベストアンサー1
これにはシェルループは必要ありません。次のことができます。
date -f file +%s |
awk 'BEGIN{srand(); now = srand()}
{print int((now - $0) / 86400), "days"}'
-d
とは-f
GNU実装の拡張ですdate
。とDec 31
解釈されますので参考にしてくださいDec 31
今年、これからも。
シェルループを使用したい場合、zsh
またはなどの日付操作サポート機能を備えたシェルを好むことができますksh93
。
これらのタイムスタンプを過去(Oct 10
たとえば、最も近い10/10/00:00:00)として解釈するには、次のようにしますzsh
。
#! /bin/zsh -
zmodload zsh/datetime || exit
now=$EPOCHSECONDS
strftime -s year %Y "$now"
(( lastyear = year - 1 ))
while IFS= read -r day; do
strftime -rs t '%Y %b %d' "$year $day" || continue
(( t <= now )) || strftime -rs t '%Y %b %d' "$lastyear $day"
print $(( (now - t) / 86400 ))
done < file
この機能には、英語の頭字語に加えて、ユーザーの月名の頭字語を理解できるという利点もあります。