質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Linux

    3904questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2770questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • bash

    674questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • UNIX

    388questions

    UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

apacheのログの中身の重複行の数字を足したい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 814

DaichiYasuda

score 85

apacheのログ解析を行っています。

ログローテートの関係でAM4:00台の行が二つできてしまいます。
28/Mar/2016:00 50123
28/Mar/2016:01 50184
28/Mar/2016:02 44923
28/Mar/2016:03 39121
28/Mar/2016:04 1298
28/Mar/2016:04 94018
28/Mar/2016:05 52432
28/Mar/2016:06 41654

左が日時で右がアクセス数となっております
28/Mar/2016:04のアクセス数をたして
28/Mar/2016:00 50123
28/Mar/2016:01 50184
28/Mar/2016:02 44923
28/Mar/2016:03 39121
28/Mar/2016:04 95316
28/Mar/2016:05 52432
28/Mar/2016:06 41654

という結果にbashでしたいのですがどのようにすればよろしいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

いろいろやり方はあると思いますが、awk を使う例。

awk '{if(NR==1){date=$1; num=$2} else{if(date==$1){num+=$2} else{print date,num; date=$1; num=$2} } } END{print date,num}' ファイル

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/06 13:03

    何度も申し訳ありません
    31/Mar/2016:04 36357
    31/Mar/2016:05 44344
    31/Mar/2016:06 43214
    31/Mar/2016:07 40015
    31/Mar/2016:08 35528
    31/Mar/2016:09 66583
    31/Mar/2016:10 75756
    31/Mar/2016:11 68177
    31/Mar/2016:12 78140
    31/Mar/2016:13 71840
    31/Mar/2016:14 76807
    31/Mar/2016:15 76619
    31/Mar/2016:16 74669
    31/Mar/2016:17 74588
    31/Mar/2016:18 79683
    31/Mar/2016:19 80130
    31/Mar/2016:20 84899
    31/Mar/2016:21 80409
    31/Mar/2016:22 68523
    31/Mar/2016:23 55679
    01/Apr/2016:00 42600
    01/Apr/2016:01 48963
    01/Apr/2016:02 46714
    01/Apr/2016:03 38397
    01/Apr/2016:04 1399

    awkについて全然わかってないので上のファイルも同じように処理させたいのですが
    やり方がよくわかりませんので、教えていただいてもよろしいでしょうか?

    あと参考になるサイトなどありましたら教えていただきたいです

    キャンセル

  • 2016/04/07 17:13 編集

    TaichiYanagiyaさんのawkの処理を簡単に説明しますと、

    読み込んだデータをもとに、

    if(NR==1){date=$1; num=$2}
    1行目なら変数"date"に1カラム目(日時)を変数"num"に2カラム目(件数)をセットする

    else{if(date==$1){num+=$2} else{print date,num; date=$1; num=$2} }
    2行目以降は1カラム目(日時)と変数"date"(1行前の日時)を比較して、
    ・日時が一致する場合は、変数"num"に2カラム目(件数)の値を足す
    ・日時が一致しない場合は、現在の変数"date"(日時)と変数"num"(同じ日時の件数の合計値)を表示する
     変数"date"に1カラム目(日時)を新たにセット(ここで次の時間に移る)
     変数"num"に2カラム目(件数)を新たにセット(ここで次の時間の件数をセット)
     そのまま最終行まで同じことを繰り返す。

    END{print date,num}'
    ただ最終行は変数"date"(日時)と変数"num"(件数)に値をセットしただけで終わっているので、最後にセットされている値を表示する

    という動作になります。

    処理としては1カラム目が一致する場合に2カラム目を合算して結果を表示するというものです。
    ですので、後から追加されたデータでも同じ方法で利用できます。
    ただ、後から追加されたデータは日時で重複している部分がないので、結果は変わらないと思います。

    キャンセル

  • 2016/04/07 21:29

    yourill さん、補足説明ありがとうございます。

    キャンセル

0

あえて bash だけで書いてみました。(多分 私なら、ruby で書いてしまう)
1.sh

#!/bin/bash
time="x"
total=0

# ログファイルの最終行を出力できるようにするためにダミー行を追加して、処理する
tmp_txt="/tmp/tmp.txt"
echo "x 0" > $tmp_txt

cat $1 $tmp_txt| while read line; do
    z=$line
    set -- $line
    if [ $1 != $time ]
    then
      if [ "x" != $time ]
      then
        echo $time $total
      fi
      time=$1
      total=$2
    else
      total=$(($total + $2))
    fi
done


実行例

$ cat 1.txt
28/Mar/2016:00 50123
28/Mar/2016:01 50184
28/Mar/2016:02 44923
28/Mar/2016:03 39121
28/Mar/2016:04 1298
28/Mar/2016:04 94018
28/Mar/2016:05 52432
28/Mar/2016:06 41654

katoy-MacBook-Pro:tmp katoy$ ./1.sh 1.txt 
28/Mar/2016:00 50123
28/Mar/2016:01 50184
28/Mar/2016:02 44923
28/Mar/2016:03 39121
28/Mar/2016:04 95316
28/Mar/2016:05 52432
28/Mar/2016:06 41654

katoy-MacBook-Pro:tmp katoy$ ./1.sh 1.txt > 2.txt
katoy-MacBook-Pro:tmp katoy$ diff 1.txt 2.txt
5,6c5
< 28/Mar/2016:04 1298
< 28/Mar/2016:04 94018
---
> 28/Mar/2016:04 95316

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3904questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • CentOS

    2770questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • bash

    674questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • UNIX

    388questions

    UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。