我有一个
形式的文件KEY-A;START;<datetime>
KEY-B;START;<datetime>
KEY-B;END;<datetime>
KEY-A;END;<datetime>
.
.
.
我想要一些sed / awk / bash魔法将它转换为
KEY-A;<datetime>;<datetime>;<duration in secs>
KEY-B;<datetime>;<datetime>;<duration in secs>
.
.
.
其中第一个<datetime>
是START,第二个是END。日期时间可由日期命令解析。
我知道这是两个不同的问题(合并和持续时间计算),我最感兴趣的是合并。
编辑:我可以通过键字段对文件进行排序,然后使用sort命令对datetime进行排序,如果这样可以简化合并的方式。
感谢。
答案 0 :(得分:1)
这样的事情可以做到:
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
答案 1 :(得分:1)
骨架答案是
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”,因为它首先结束。如果需要,可以通过sort
传达答案。