我有一些数据,比如
[09359]0000.365604| =>SttSasph_Hmbm_bSPO_PhQmOm (Hmbm_PhQmOm_utWmP.asp)
[09359]0000.365687| =>Hmbm_bSPO_PhQmOm_Wd (Hmbm_PhQmOm_utWmP.asp)
[09359]0000.365879| =>SttSasph_Hmbm_quOuO_PhQmOm (Hmbm_PhQmOm_utWmP.asp)
[09359]0000.365890| =>Hmbm_quOuO_PhQmOm_Wd (Hmbm_PhQmOm_utWmP.asp)
[09359]0000.365979| WSmmOT SDDQ vSQWSbmO not POt, QOvOQtWnH to Onv mOthod
[09359]0001.625300| db_HOt_POPPWon_Wd: aspuQQOnt POPPWon WD WP 1016,59
[09359]0002.365979| WSmmOT SDDQ vSQWSbmO not POt, QOvOQtWnH to Onv mOthod
每行都以方括号中的进程编号(可以更改)开头
然后在本例中为模块 (0001) 后的秒数
然后是句号后的微秒。
然后是要终止的管道。
其余部分可以忽略
我需要的是计算
将秒转换为秒
将微秒添加到转换后的微秒(从 1)
找出以微秒为单位的差异。 例如,2行-行1,行3-行2,行4-行3等等。
将结果打印到单独的文件中。
我试图使用这个逻辑。但是,它没有用。我可以得到优化方法的建议吗?改进我现有的逻辑
sec=$(grep '^[.{1,}]' mass.May28.1 | cut -d "| " -f1 | cut -c8- | cut -d"." -f1)
msec=$(grep '^[.{1,}]' mass.May28.1 | cut -d "| " -f1 | cut -c8- | cut -d"." -f2)
$f_msec=$((sec * 1000000 + msec)) > final_difference_file
如果您熟悉awk
,则可以使用此脚本:
脚本.awk
BEGIN{ FS="[\[\]\|]+" }
{ printf("[%s]%011.6f|%sn", $2,$3-prev,$4)
prev = $3 }
像这样使用它:awk -f script.awk yourfile
第一行将字段拆分设置为使用括号和竖线(忽略它们转义正则表达式元字符符号所需的反斜杠)。第二行打印字段并计算时间差异。最后一行将计算的当前时间存储在下一行中。
这也可以通过bash
脚本来完成。由于 bash 缺乏浮点运算,我们必须分别收集秒和微秒(或者为每行调用 bc
等外部工具):
script.sh
IFS='|[].'
factor=1000000
prev=0
while read dummy pid secs msecs text;
do
msecs=$(( $secs * $factor + $msecs ))
timediff=$(( $msecs - $prev ))
prev=$msecs
secs=$(( $timediff / $factor ))
msecs=$(( $timediff - $secs * $factor ))
printf "[%s]%04d.%06d|%sn" "$pid" "$secs" "$msecs" "$text"
done
像这样使用它:bash script.sh yourfile