読者です 読者をやめる 読者になる 読者になる

日付の名前がついたファイルを週ごとに連結する

ログファイルを扱っていると、タイトルのような需要がちょくちょく出てくる。

例えば、一週間でログインしたユーザーのみを知りたいときとか。

この場合、日付の名前がついたファイルを週ごとに連結して、sortしてuniq・・・ってことになるのだが、週ごとに連結するのは、割と面倒くさい作業である。

2週間程度なら

2014-06-05 2014-06-06 (省略) 2014-06-11 > week_2014-0611

のように手動でコマンドを打ってもいいだろう。

でも、もし、これが2ヶ月にもわたったら??

そのために自動化しようと考えてこんなスクリプトを作った。 (正直いうと、もっと楽な方法があるんじゃないかとまだ疑っている。そんな方法をご存知の方は教えていただきたい)

# author="Kensuke Mitsuzawa"
# date="2014/06/11"
# 日付系列を与えると、そのその日付が名前のファイルを週ごとに連結して、連結したファイルを標準出力するスクリプト
#------------------------------------------------------------
start_day_of_range=$1
end_day_of_range=$2
#start_day_of_range="2014-03-03"
#end_day_of_range="2014-03-30"
#------------------------------------------------------------
# 入力ファイルに関する記述
input_file_prefix="ここに入力パスのprefixを記述"
#------------------------------------------------------------
# 出力ファイルに関する記述
output_file_prefix="ここに出力パスのprefixを記述"
#------------------------------------------------------------
end_day=`date -d"$end_day_of_range" +%s`
start_day=`date -d"$start_day_of_range" +%s`
diff=$(expr $end_day - $start_day)  # 引き算はこう記述しないといけない
diff=$(expr $diff / 86400)  # 差を求めた後に割らないといけない

date_seq=""
for i in `seq 0 $diff`
do
    if [ 0 -eq $i ]
    then
        date_seq=`echo ${date_seq} ${input_file_prefix}${start_day_of_range}`
    
    elif [ 6 -eq $(expr $i % 7) ]
        then
        #週の終わりの日の場合は、ファイルを連結して出力 
        target_date=`date --date "${start_day_of_range} ${i}days" +"%Y-%m-%d"`
        date_seq=`echo ${date_seq} ${input_file_prefix}${target_date}`
        
        output_file_path=$output_file_prefix$target_date
        cat ${date_seq} > $output_file_path
        date_seq=""  # date_seqの初期化
    else
        target_date=`date --date "${start_day_of_range} ${i}days" +"%Y-%m-%d"`
        date_seq=`echo ${date_seq} ${input_file_prefix}${target_date}`
    fi
done

exit