2017-09-01 25 views
1

初心者でここをクリックしてスクリプトを作成してください。その後、私は日付の違いを見つけることができます記載されているアップロード配列の日付を日付計算の計算に追加するには

の平均間隔を見つける

* 20170815041135 
* 20170820041135 
* 20170823071727 
* 20170826040609 
* 20170828050704 
* 20170830153011 

私はそれぞれのアップロードの間の日数を計算する必要があります。私の顧客がアップロードし、それぞれがこのようなファイル名に日付スタンプを持っていますこのコマンドを使用して、二つの日付

echo $((($(date --date="20170831" +'%s') - $(date --date="20170821" +'%s'))/(60*60*24))) 

間ので、ここで、私は配列が必要であることを読んだ複数の日付を行うには10

を与える私の範囲0ですf日付を配列にアップロードする。

array=(`20170830153011`,`20170828050704`,`20170826040609`,`20170823071727`,`20170820041135`,`20170815041135`) 

私は私が計算に私の配列の日付を追加するにはどうすればよいこの

for i in "${array[@]}" do 
    ? 

のような計算をループする必要が読みましたか?配列へ

+0

"それぞれファイル名に日付スタンプがあります" - 完全なファイル名は何ですか? –

+0

XXX_1_20170830200211.bin –

+0

'filename = XXX_1_20170830200211.bin; tmp = $ {filename%.bin}; datestamp = $ {tmp ## * _} ' - https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion –

答えて

1

あなたの日付時刻:今、私たちは違いを計算するためにそれらを反復することができます

epochs=() 
for timestamp in "${timestamps[@]}"; do 
    iso8601=$(sed -r 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3T\4:\5:\6/' <<<"$timestamp") 
    epochs+=("$(date -d "$iso8601" "+%s")") 
done 
printf "%s\n" "${epochs[@]}" 
1502784695 
1503216695 
1503487047 
1503734769 
1503911224 
1504121411 

timestamps=(
    20170815041135 
    20170820041135 
    20170823071727 
    20170826040609 
    20170828050704 
    20170830153011 
) 

は、今度はエポック時間にそれらを変換してみましょう。なお、bashの配列インデックスはゼロから始まり:

n=0 
sum=0 
for ((i=1; i < "${#epochs[@]}"; i++)); do 
    ((n++, diff=(${epochs[i]} - ${epochs[i-1]}), sum+=diff)) 
    echo "diff $n = $diff seconds = $((diff/86400)) days" 
done 
echo "average = $((sum/n)) seconds = $((sum/n/86400)) days" 
diff 1 = 432000 seconds = 5 days 
diff 2 = 270352 seconds = 3 days 
diff 3 = 247722 seconds = 2 days 
diff 4 = 176455 seconds = 2 days 
diff 5 = 210187 seconds = 2 days 
average = 267343 seconds = 3 days 
+0

を参照してくださいありがとうグレンこのように –

0

は、1970年からの秒で日付を変換 差を計算します。 私は、bashの日付関数がその日付からの夏時間を考慮していることを願っています。