bashを使用して日付差を計算する必要があります。

bashを使用して日付差を計算する必要があります。

日付を含むファイルがあります。

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とは-fGNU実装の拡張です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

この機能には、英語の頭字語に加えて、ユーザーの月名の頭字語を理解できるという利点もあります。

おすすめ記事