unix从文件行中找到差异

时间:2016-05-29 12:44:27

标签: bash shell unix scripting

我有一些像

这样的数据
[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

  1. 将秒转换为MircoSeconds

  2. 将微秒添加到转换的微秒(从1开始)

  3. 找出微秒的差异。例如。 line2-line1,line3-line2,line4-line3等。

  4. 将结果打印在单独的文件中。

  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
    

2 个答案:

答案 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