我有一个已检测的日志文件,其中有6行重复的第一列,如下所示。
//SC001@1/1/1@1/1,get,ClientStart,1363178707755
//SC001@1/1/1@1/1,get,TalkToSocketStart,1363178707760
//SC001@1/1/1@1/1,get,DecodeRequest,1363178707765
//SC001@1/1/1@1/1,get-reply,EncodeReponse,1363178707767
//SC001@1/1/1@1/2,get,DecodeRequest,1363178708765
//SC001@1/1/1@1/2,get-reply,EncodeReponse,1363178708767
//SC001@1/1/1@1/2,get,TalkToSocketEnd,1363178708770
//SC001@1/1/1@1/2,get,ClientEnd,1363178708775
//SC001@1/1/1@1/1,get,TalkToSocketEnd,1363178707770
//SC001@1/1/1@1/1,get,ClientEnd,1363178707775
//SC001@1/1/1@1/2,get,ClientStart,1363178708755
//SC001@1/1/1@1/2,get,TalkToSocketStart,1363178708760
注意:,(逗号)是此处的分隔符
同样明智的是,日志文件中有许多重复的第一列值(ID)(上例中只有两个值(ID); // SC001 @ 1/1/1 @ 1/1和// SC001 @ 1 / 1/1 @ 1/2我需要合并日志记录,格式如下。
ID,ClientStart,TalkToSocketStart,DecodeRequest,EncodeReponse,TalkToSocketEnd,ClientEnd
//SC001@1/1/1@1/1,1363178707755,1363178707760,1363178707765,1363178707767,1363178707770,1363178707775
//SC001@1/1/1@1/2,1363178708755,1363178708760,1363178708765,1363178708767,1363178708770,1363178708775
我想这个练习有一个bash脚本,并感谢专家对此的支持。希望可能有更高效的sed或awk解决方案。
非常感谢
答案 0 :(得分:1)
一种方式:
sort -t, -k4n,4 file | awk -F, '{a[$1]=a[$1]?a[$1] FS $NF:$NF;}END{for(i in a){print i","a[i];}}'
sort
命令根据最后一个(第4个)列对文件进行排序。 awk
获取已排序的输入并形成一个数组,其中第一个字段是键,值是最后一列的值的组合。