Unix 从文件行中找出区别



我有一些数据,比如

[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行-行1,行3-行
  4. 2,行4-行3等等。

  5. 将结果打印到单独的文件中。

我试图使用这个逻辑。但是,它没有用。我可以得到优化方法的建议吗?改进我现有的逻辑

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

相关内容

  • 没有找到相关文章

最新更新