1

何百万ものレコードを含むログ ファイルから 1 時間ごとの平均応答時間を計算しようとしています。以下にログからの抜粋を示します。

現在、一意の ID と開始時刻と終了時刻を持つ行を持つ一時ファイルを作成しようとしています。その後、この一時ファイルで別のスクリプトが実行され、1 時間ごとの平均応答時間が計算されます。一時ファイルを作成します。

もっと早くできる方法はありますか?または実行時間が短いより良いスクリプト。注: これらの UNIQID は順番に来るわけではありません。

log file format
2012-06-04 13:04:19,324 UNIQID1
2012-06-04 13:04:20,120 UNIQID1
2012-06-04 13:05:19,324 UNIQID2
2012-06-04 13:06:20,120 UNIQID2
2012-06-04 13:07:19,324 UNIQID3
2012-06-04 13:08:20,120 UNIQID3
2012-06-04 13:08:49,324 UNIQID4
2012-06-04 13:09:50,120 UNIQID4

これが私のコードです:

uids=`cat $i|grep "UNIQ" |sort -u` >> $log
for uid in ${uids}; do  
    count=`grep "$uid" test.log|wc -l`
    if [ "${count}" -ne "0" ]; then
        unique_uids[counter]="$uid"
        let counter=counter+1   
    fi   
done


echo ${unique_uids[@]}   
echo $counter  
echo " Unique No:" ${#unique_uids[@]}
echo uid StartTime EndTime" > $log

for unique_uids in ${unique_uids[@]} ; do
    responseTime=`cat $i|grep "${unique_uids}" |awk '{split($2,Arr,":|,"); print Arr[1]*3600000+Arr[2]*60000+Arr[3]*1000+Arr[4]}'|sort -n`
    echo $unique_uids $responseTime >> $log
done

御時間ありがとうございます!

4

2 に答える 2

1

いくつかの簡単な修正:

  • cat呼び出しは必要ありません。の最後のパラメータとしてファイル名を使用するだけですgrep
  • ファイルと変数の両方に値を保存しないでください。どちらか速い方を使用してください。通常、どちらも使用する必要はありません。ループはwhile IFS= read -r date time idおそらく高速になります。
于 2013-06-05T13:36:02.300 に答える