• ベストアンサー

AWKにて時刻差分を取得したい

お世話になります。 現状、以下のログがあるのですが、 <snip> 日時, 通信開始時刻, 通信終了時刻・・・ 2008/4/8, 14:00:00.3, 14:10:00.5, ・・・ <snip> で、AWK(awk -F , )にて時刻差分を取得したいと考えたのですが、 $3-$2の出力結果が"0""-1"になり、表示されません。 うまく時刻差分を取得する方法はないでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.1

基準時点からの経過秒数を返すのや日時の書式を整形するのはあるけど、A-Bのように直接日時を計算するような関数はなかったと思います。 他の言語でもそうですが、時間(文字列)を秒数に変換してから、計算するようにして下さい。 時間表記が「hh:mm:ss」の場合 num = split($2,time,":") $2 = time[1] * 60 * 60 + time[2] * 60 + time[3] num = split($3,time,":") $3 = time[1] * 60 * 60 + time[2] * 60 + time[3] $3 - $2 で経過秒が得られます。

参考URL:
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
hokuhoku7
質問者

お礼

ありがとうございました。大変助かりました。 すこし、タイトルとそれるのですが、 $ gawk -F, -f exam.awk data.txt 92 101.7 60 55.2 計算後の、出力された結果をまとめて合計することってできますでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.2

変数に時刻差分の合計を入れて、ENDで最後にそれを出力するようにすればいいです。 { #ファイル読み込んで、差分を求める処理 jikan = $3-$2; total += jikan; #差分の合計 } END{ #最後に実行される処理 print "合計 " total " 秒"; } ↓でも一通り読めば、大雑把な使い方は理解出来ます。 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/

参考URL:
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/
hokuhoku7
質問者

お礼

参考にさせていただきます。AWKは独特ですねぇ。 勉強になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 時刻フォーマットの編集

    時刻フォーマットの編集方法について 教えてください。 以下の様な時刻(CLF の時刻の書式)を YYYYMMDDの形に変更したいのですが 何かいい案を頂けないでしょうか? -------------------- 26/Mar/2005:18:22:15 +0900 -------------------- 可能ならば、Linuxのコマンド(awkコマンド等)で 行いたいのですが、JAVAなどでコーディングしないと駄目でしょうか?? ※具体的にいえば、Apacheが出力しているログ内の  日付書式をYYYYMMDDの形で取得したいのです。

  • ログの集計で

    ログの集計で困っております。 そのログというのがジョブの開始時刻と終了時刻が別々の行に出力されているもので、 このログをジョブごとに開始と終了時刻を別々の行から取得し、出力結果は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 : ~~~ここまで~~~

    • ベストアンサー
    • Perl
  • awkについての質問

    実行環境:AIX5.2 シェル:Ksh 以下の2点をシェル内部で実行しているのですが、上手くいきません。 ご教授お願いいたします。 (1)System関数の実行結果(標準出力)をTERM上に表示させず、処理をしたい。 #!/usr/bin/ksh awk '{ system("ls -l") ###具体的にはls -l 結果の2行目、第一フィールドをawk内で変数に格納 }' (2)変数に格納された文字列のバイト数を取得し、変数に格納したい。 length()は文字数を取得できる事は理解したのですが、文字数ではなく、文字列のバイト数を取得したいです。awkに実装されている関数などありますでしょうか?

  • awkのセパレータ指定について

    awkのセパレータ指定について教えてください。 以下のようなファイルがありそれを'||'区切りで出力したいです。 下記のような指定をしてみたのですが、 うまくいきませんでした。 cat text | awk -F '||' '{print $1}' [test.txt] aaa||bbb||ccc [期待する結果] print $1 → aaa print $2 → bbb print $3 → ccc どなたか教えてください。 よろしくお願いします。

  • シェルスクリプト grep

    下記のようなファイルから年月をkeyとして2009/08/05以降のものだけを取得してくる方法がわかりません。 grepでは日時指定をしようにも方法がわからず、awkを使ってもいまいちうまくいきません。 何か方法ありますでしょうか 2009/08/04 08:00:07 開始 2009/08/04 08:00:07 終了 2009/08/05 08:00:07 開始 2009/08/05 08:00:07 終了 2009/08/05 08:00:07 開始 2009/08/05 08:00:07 終了 2009/08/06 08:00:07 開始 2009/08/06 08:00:07 終了

  • バッチファイルの時刻

    下記は、6秒待って時刻を表示するのを繰り返す記述ですが、 「開始」の時間と「終了」の時間が同じになってしまいます。 【コード】 -------------------------------------------------- :flg_check if exist %FlgFile% ( echo %time% 開始 echo WScript.Sleep 6000 > %TmpFile% cscript //NoLogo %TmpFile% echo %time% 終了 goto flg_check ) -------------------------------------------------- 【結果】 -------------------------------------------------- 10:26:14.30 開始 10:26:14.30 終了 10:26:20.41 開始 10:26:20.41 終了 -------------------------------------------------- 開始時刻の6秒後の時刻が終了時刻にならないのですが、なぜでしょうか?

  • 指定した日時間の合計を取得したい

    拙い質問文となりますがご容赦ください。 エクセルで関数を用いて、ある日時間の合計数を取得させたいです。 以下条件となります。 1.関数を組み込むファイルに日時を入力(A1に開始日時、A2に終了日時を入力) 2.別のファイルに管理されている日時に対応した数値を取得させたい (1.で入力したA1~A2までの間の合計を1.のファイルに出力させたい) 特定の日時を出力させるだけならsumifやhlookupの検索条件でA1を指定すればよいのですが、A1からA2までの合計、となると検索条件が組めません。 A1~A2の期間は基本的には1週間なので、強引にsumの中にhlookupを7つ組み込めばなんとかなりますが、ファイルのパスが長い為、スマートではありません) A1~A2の合計を取得する A1~7日間分の合計を取得する ※現在A1を始点として、A2からA1の差分を日時数として、その日時分取得する、という方法がうまくいきそうなイメージがありますが、実装まで至っていません。。。 よろしくお願い致します。

  • UNIX:ファイルから複数の特定の文字列を含む行以外を削除したい

    お世話になります。 現在、仕事で、日に1度更新されるあるログファイルを確認しています。 そのログファイルは、数千行あり、その内容は (A)50種類ほどの記号 (B)開始日時 (C)状態 (D)終了日時 が含まれます。 今は、目視で開始日時、状態、終了日時の3種類の値を確認しているのですが ツールで自動化したいと考えています。 試したことは、grepで3つの状態を確認することです。 grep 開始日時 ログファイル >> 確認.log grep 状態 ログファイル >> 確認.log grep 終了日時 ログファイル >> 確認.log ですが、この方法だと、下記のようになって、それぞれの 対応関係がわかりずらいです。 ■確認.log ・開始日時 ・開始日時 ・開始日時 ・状態 ・状態 ・状態 ・終了日時 ・終了日時 ・終了日時 ですので、こんな感じで確認できればと思います。 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 UNIXシェル有識者の方で、なにかヒントがあれば アドバイスを頂けますでしょうか。 以上、よろしくお願いします。

  • 開始時刻+経過時間=終了時刻になる計算式はありますか?

    エクセルについてお尋ねします。 (1)下記のようにA3に"3"と入力するだけで3時間と認識する事は可能でしょうか? (2)上記の結果をふまえ、開始時刻(A1)に経過時間(A3)を足して終了時刻(A2)を表示する事は可能でしょうか?   A1 → 9:00(開始時刻)   A3 → 3(経過時間)   A2 → 12:00(終了時刻) ←この時刻を求める。

  • awkで¥をエスケープする方法

    awkで以下のように文字列置換したいのですが、変数strA内で¥マークを使用すると正常に置換してくれません。どのようにエスケープすれば良いのでしょうか? ================================================= --実行コマンド---------- gawk -f CNV.awk input.txt --input.txt---------------- いぬ¥ねこ --CNV.awk---------------- strA="ぬ¥ね"; strB="★"; gsub(strA, strB, $0); print $0; ================================================= このとき、「い★こ」という結果を期待しているのですが出力がありません。 また、 strA="ぬ¥¥ね"; や strA='ぬ¥ね'; と指定しても同様にダメでした。 どなたか解決策をご存知でしたらご教授宜しくお願い致します。

    • ベストアンサー
    • Ruby
このQ&Aのポイント
  • インクの入れ方がわからない!開けるとオレンジの受け皿が邪魔で困っています。どうすれば入れるのでしょうか
  • パソコンのOSはWindows10で、有線LANで接続しています。関連するソフト・アプリはありません。電話回線の種類はjcomです。
  • ブラザー製品のインクの入れ方について相談です。開けるとオレンジの受け皿が邪魔で入れられません。パソコンのOSはWindows10で、有線LANで接続しています。関連するソフト・アプリはありません。電話回線の種類はjcomです。
回答を見る