![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
ログの集計で困っております。
そのログというのがジョブの開始時刻と終了時刻が別々の行に出力されているもので、
このログをジョブごとに開始と終了時刻を別々の行から取得し、出力結果は1行に1ジョブで出したいと考えています。
ログがUNIXのログなので、当初はshellスクリプトでと思っていたのですが、
shellだとログを何度も先頭から読み込む形となり、perlで可能ではないかと思い、質問させていただきました。
perlはあまり詳しくはないですが、よろしくお願いいたします。
元のログイメージ
~~~ここから~~~
START 08:00:00 Job001
START 08:05:00 job002
END 08:07:01 job001
START 08:08:00 job003
END 08:10:00 job002
:
~~~ここまで~~~
出力イメージ
~~~ここから~~~
job001 08:00:00 - 08:07:01
job002 08:05:00 - 08:10:00
:
~~~ここまで~~~
No.2ベストアンサー
- 回答日時:
キーがホスト名(?)のハッシュ(連想配列)に、STARTやらENDやらのデータを放り込んでいって、
最後まで行ったらそこから必要なデータを取り出せばよいです。
これはちとやりすぎの例
use strict;
use warnings;
use feature ':5.10';
my %log;
while (<DATA>) {
chomp;
my ($kind, $time, $host) = split q{ }, $_, 3;
$log{$host} ||= [$host];
push @{$log{$host}}, $time;
}
map {printf "%s %s - %s\n", $_->[0], $_->[1], $_->[2]}
sort {$a->[1] cmp $b->[1]}
grep {@$_ > 2}
values %log;
__END__
START 08:00:00 job001
START 08:05:00 job002
END 08:07:01 job001
START 08:08:00 job003
END 08:10:00 job002
結果:
job001 08:00:00 - 08:07:01
job002 08:05:00 - 08:10:00
一番最初のデータが Job001 か job001 なのかよくわからないのと、
大小文字の違いを無視していいかどうかわからなかったので
適当にやってます。
最初はハッシュに放り込むのを時刻データの文字列にする
(STARTとENDの時刻は適当な記号で連結する)のが
理解しやすいんじゃないでしょうか。
ご回答ありがとうございます。
なるほど。
一行づつ読んで処理するのではなく、全部読み取ってから、メモリ上で処理させるのですね。
shellだと一行づつ読んで・・と思っていたので、これなら処理時間的にも問題なさうです。
map関数など知らなかったこともあり、勉強になりました。
まだ自分の中で消化し切れてない部分もありますが、何度か試して理解していきます。
本当にありがとうございました。
No.3
- 回答日時:
Perlの連想配列(ハッシュ)は順番を保存する機能がないのでバラバラに
なってしまいますが以下のようにしたらどうでしょうか。
(以下は単純に文字列を処理しているので実際にはその文字列処理の
部分をファイル処理に変えてやればいいです)
use strict;
my $LOG = <<'LOG';
START 08:00:00 Job001
START 08:05:00 job002
END 08:07:01 job001
START 08:08:00 job003
END 08:10:00 job002
LOG
my $log = {};
foreach(split(/\n/, $LOG)) {
my ($flg, $time, $job) = split(/\s/, $_);
$log->{lc($job)}->{uc($flg)} = $time;
}
while(my ($key, $value) = each(%$log)) {
printf("%s %s - %s\n", $key, $value->{'START'}, $value->{'END'});
}
1;
順番を保存したい場合はTie::IxHashというPerlモジュールを使用して
ください。
参考URL:http://katsubemakito.net/cgiperl/variable/hash/p …
ご回答ありがとうございます。 参考になりました。
参考URL先も見させて頂きました。
こちらも色々と参考になる例があり、非常に助かりました。
ありがとうございました。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?5a7ff87)
No.1
- 回答日時:
>perlはあまり詳しくはないですが、よろしくお願いいたします。
どのくらい書けますか?
連想配列を使えば簡単に出来そうです。
返答ありがとうございます。返事が遅くなりました。
単純なテキストから項目を抽出する という程度がなんとか出来るくらいです。
連想配列についても、そういうのがあるという事は知っていましたが、
使ったことがありませんでした。
で 連想配列が今回のに使えそうだということはネットで調べて見たのですが、
具体的に今回のログ集計にどう使うのか?まではまだ分かっていないです。
よろしければ連想配列の使い方などを教えていただければと思います。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- 中学校 英語の問題で、 「私のおばの仕事は花を育てることなんだ。」 正答は 「My aunt job is 0 2023/01/05 22:58
- Perl Perlでファイルの末尾から指定文字列を検索してファイルに吐き出したい 4 2022/04/04 16:15
- Excel(エクセル) エクセルで勤務時間の計算をしています。 下記図でstartは勤務開始時間、endは勤務終了時間です。 5 2022/06/07 13:51
- 英語 意味に違いがありますか(英語) 1 2023/05/14 11:57
- 会社・職場 30歳主婦でパートで働いてます。夫の扶養外れてるのでガッツリ働かないと損になるのですが、人間関係が辛 6 2022/08/07 15:00
- Excel(エクセル) 指定した値以上の中で最小値を出したい 7 2022/10/24 21:12
- 英語 英文について教えて下さい。 0 2022/12/23 11:45
- 転職 外資系企業のバックグラウンドチェックについて 1 2023/08/22 19:54
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハッシュのハッシュを実現したい。
-
文字列を変数名として扱う方法
-
一意(ユニーク)かつ、ソート...
-
ハッシュ検索はなぜ速い
-
投票データをハッシュを使用し...
-
井桁と シャープと ハッシュタグ
-
ハッシュをkeysでうまく抽出で...
-
ハッシュ関数について質問です。
-
短いハッシュの作り方
-
ハッシュにおける値の取り出し
-
perlで配列名を動的に作り出したい
-
カタカナの50音順ソーティング
-
レコードセットを配列のハッシ...
-
Perlで変数に代入された文字の...
-
CGI入門者に適した本を教えてく...
-
重複ファイルを削除したいので...
-
ハッシュリストって単にハッシ...
-
VBのReturnの使い方
-
VBAでの一時停止と再開の方法
-
VBAで3秒だけ時間を止めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
まったく同じファイルのハッシ...
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
英語でのシャープとコメの呼び...
-
ハッシュ値が一致したデータは...
-
重複ファイルを削除したいので...
-
ハッシュの考え方、使用例を分...
-
ハッシュのハッシュを実現したい。
-
ハッシュリストって単にハッシ...
-
短いハッシュの作り方
-
データベースでユーザーのパス...
-
*(アスタリスク)の意味
-
多次元配列から重複を削除
-
ハッシュ値によるファイルの同...
-
perlで配列名を動的に作り出したい
-
Perlでハッシュや配列で重複す...
-
ハッシュマーク以降のアドレス取得
-
連想配列のサイズ制限
おすすめ情報