次の形式の3列データがあります。
TIME MPID CPID
16:45:51 10051 77845
16:45:51 10051 77845
16:46:52 10051 77846
16:46:53 10051 77846
16:48:38 10051 77847
16:48:38 10051 77847
16:48:39 10051 77995
16:49:31 10051 77848
16:49:31 10051 77848
16:51:03 10051 77849
16:51:03 10051 77849
ここで、TIME列はHH:MM:SS形式のタイムスタンプで構成されています。 MPID および CPID 列は識別番号です。その意味は私の質問にとって重要ではありません。 MPID値もデータセットに存在し、出力に伝播する必要があることを除いては機能しません。
私が望むのは、CPID値が一致する行のペアを識別し、その時間の差を計算することです。たとえば、上記の例には、CPIDが77846の2行(3行目と4行目)があります。その時間は16:46:52と16:46:53なので、違いを計算したいです。
16:46:53 - 16:46:52 = 00:00:01
また、この結果を次の形式で出力したいと思います。
MPID 10051 CPID 77846 Total time difference: 01 seconds
与えられたCPIDがデータセットに正確に2回表示されない場合は、それを無視したいと思います。
サンプルデータが与えられた場合、希望の出力は次のようになります。
MPID 10051 CPID 77845 Total time difference: 00 seconds
MPID 10051 CPID 77846 Total time difference: 01 seconds
MPID 10051 CPID 77847 Total time difference: 00 seconds
MPID 10051 CPID 77848 Total time difference: 00 seconds
MPID 10051 CPID 77849 Total time difference: 00 seconds
ベストアンサー1
仮説入力する
uniq -D
すべての重複行を表示するために使用される差分ファイル。3番目の場所フィールドただ、タイトルも削除されます。次に、date
フォーマットを使用して%s
時間を秒に変換して減算します。残りは標準ですシェル:uniq -D -f 2 input | while read a b c && read d e f ; do g=$(( $(date -d $d +%s) - $(date -d $a +%s) )) printf "MPID %s CPID %s Total time difference: %02i seconds\n" $b $c $g done
出力:
MPID 10051 CPID 77845 Total time difference: 00 seconds MPID 10051 CPID 77846 Total time difference: 01 seconds MPID 10051 CPID 77847 Total time difference: 00 seconds MPID 10051 CPID 77848 Total time difference: 00 seconds MPID 10051 CPID 77849 Total time difference: 00 seconds
以前の仕様(基準:OPコメント)、より多くのコードが必要です:
uniq -D -f 2 input | while read a b c && read d e f ; do g=$(( $(date -d $d +%s) - $(date -d $a +%s) )) printf "For %s %s time difference: %02i:%02i:%02i\n" \ $b $c $((g/360)) $(((g/60)%60)) $((g%60)) done
出力:
For 10051 77845 time difference: 00:00:00 For 10051 77846 time difference: 00:00:01 For 10051 77847 time difference: 00:00:00 For 10051 77848 time difference: 00:00:00 For 10051 77849 time difference: 00:00:00