我有一些像
这样的数据[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)之后的秒数
然后在fullstop之后的MicroSeconds。
然后管道终止。
休息部分可以忽略
我需要的是caluclate
将秒转换为MircoSeconds
将微秒添加到转换的微秒(从1开始)
找出微秒的差异。例如。 line2-line1,line3-line2,line4-line3等。
将结果打印在单独的文件中。
我试图使用这个逻辑。但是,它没有用。 我可以通过优化的方式获得建议吗? 我现有逻辑的改进
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
答案 0 :(得分:1)
如果您对awk
感到满意,那么您可以使用此脚本:
<强> script.awk 强>
BEGIN{ FS="[\\[\\]\\|]+" }
{ printf("[%s]%011.6f|%s\n", $2,$3-prev,$4)
prev = $3 }
像这样使用:awk -f script.awk yourfile
第一行设置fieldsplitting以使用括号和管道(忽略它们需要的反斜杠来转义符号为regexp元字符的符号)。第二行打印字段并计算timediff。最后一行在下一行中存储计算的当前时间。
答案 1 :(得分:0)
这也可以使用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|%s\n" "$pid" "$secs" "$msecs" "$text"
done
像这样使用:bash script.sh yourfile