在bash/sed中,如何将具有公共字段的两行合并为一行

在bash/sed中,如何将具有公共字段的两行合并为一行,bash,sed,awk,Bash,Sed,Awk,我有一份表格档案 KEY-A;START;<datetime> KEY-B;START;<datetime> KEY-B;END;<datetime> KEY-A;END;<datetime> . . . KEY-A;开始 键-B;开始 键-B;结束; 键-A;结束; . . . 我想要一些sed/awk/bash魔法来将其转换为 KEY-A;<datetime>;<datetime>;<duration in s

我有一份表格档案

KEY-A;START;<datetime>
KEY-B;START;<datetime>
KEY-B;END;<datetime>
KEY-A;END;<datetime>
.
.
.
KEY-A;开始
键-B;开始
键-B;结束;
键-A;结束;
.
.
.
我想要一些sed/awk/bash魔法来将其转换为

KEY-A;<datetime>;<datetime>;<duration in secs>
KEY-B;<datetime>;<datetime>;<duration in secs>
.
.
.
KEY-A;;;
键B;;;
.
.
.
其中第一个
是开始,第二个是结束。日期时间可通过日期命令进行解析

我知道这是两个不同的问题(合并和持续时间计算),我最感兴趣的是合并

编辑:我可以按键字段对文件进行排序,然后使用sort命令按日期时间对文件进行排序,如果这样可以简化合并操作的话


谢谢。

像这样的东西可以:

awk 'BEGIN{FS=OFS=";"}
     /START/{b[$1];a[$1,"st"]=$3}
     /END/{a[$1,"end"]=$3}
     END{for (i in b) print i, a[i,"st"], a[i,"end"], a[i,"end"]-a[i,"st"]}' file
例如,给定此文件

$ cat a
key-a;START;1391521821
key-b;START;1391511821
key-a;END;1391521221
key-b;END;1391521831
它返回:

$ awk 'BEGIN{FS=OFS=";"} /START/{b[$1];a[$1,"st"]=$3} /END/{a[$1,"end"]=$3} END{for (i in b) print i, a[i,"st"], a[i,"end"], a[i,"end"]-a[i,"st"]}' a
key-a;1391521821;1391521221;-600
key-b;1391511821;1391521831;10010
基本答案是

awk -F';' -v OFS=';' '
    function diff(strt, end) {
        # do stuff
    }
    $2 == "START" {start[$1]=$3; next} 
    {print $1, start[$1], $3, diff(start[$1],$3)}
'
这将首先打印“KEY-B”,因为它首先结束。如果需要,请将答案通过
排序

的格式是什么?