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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

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

CentOS

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

Linux

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

UNIX

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

Q&A

解決済

2回答

1532閲覧

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

DaichiYasuda

総合スコア173

bash

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

CentOS

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

Linux

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

UNIX

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

0グッド

1クリップ

投稿2016/04/06 00:44

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でしたいのですがどのようにすればよろしいでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

bash

1#!/bin/bash 2time="x" 3total=0 4 5# ログファイルの最終行を出力できるようにするためにダミー行を追加して、処理する 6tmp_txt="/tmp/tmp.txt" 7echo "x 0" > $tmp_txt 8 9cat $1 $tmp_txt| while read line; do 10 z=$line 11 set -- $line 12 if [ $1 != $time ] 13 then 14 if [ "x" != $time ] 15 then 16 echo $time $total 17 fi 18 time=$1 19 total=$2 20 else 21 total=$(($total + $2)) 22 fi 23done

実行例

$ 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

投稿2016/04/09 01:20

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 02:21

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaichiYasuda

2016/04/06 04: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について全然わかってないので上のファイルも同じように処理させたいのですが やり方がよくわかりませんので、教えていただいてもよろしいでしょうか? あと参考になるサイトなどありましたら教えていただきたいです
yourill

2016/04/07 08:15 編集

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カラム目を合算して結果を表示するというものです。 ですので、後から追加されたデータでも同じ方法で利用できます。 ただ、後から追加されたデータは日時で重複している部分がないので、結果は変わらないと思います。
TaichiYanagiya

2016/04/07 12:29

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問