データテーブル内の一致するレコード間のペアごとの時間差を計算します。

データテーブル内の一致するレコード間のペアごとの時間差を計算します。

次の形式の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

  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
    
  2. 以前の仕様(基準: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
    

おすすめ記事