从bash中的循环迭代中获取时间差

时间:2016-08-31 14:01:17

标签: bash

我有一个如下的输入文件;

975700 18:32:32.956
975700 18:32:32.971
975700 18:32:33.018
975701 18:32:32.987
975702 18:32:32.987
975702 18:32:33.003
975702 18:32:33.034

我想采用相同身份证号码的时差,到目前为止我能够提出以下代码;

while read jobnum time
do
    if [[ "$prevjobnum" != "$jobnum" ]] && [[ `grep $jobnum $joblst|wc -l` -eq 1 ]]
    then
        echo "$jobnum incomplete log"
    elif [[ "$prevjobnum" == "$jobnum" ]]
    then
        ENDTIME=`date +%s.%N -d "$time"`
        STARTTIME=`date +%s.%N -d "$prevtime"`
        DIFF=$(echo $ENDTIME - $STARTTIME | bc | sed 's/0\{1,\}$//')

        echo "$jobnum clip time is $DIFF seconds"
    else
        :
    fi

但是它仅适用于ID的一个和两个实例。我还想让它工作,以便它可以为ID的第一个和最后一个实例做差异,如果它超过两个,如下所示;

975700 18:32:32.956
975700 18:32:32.971
975700 18:32:33.018

想获得如下的输出;

975700 clip time is .062 seconds
975701 incomplete log
975702 clip time is .047 seconds

1 个答案:

答案 0 :(得分:1)

以下脚本可能是一个很好的起点:

#!/bin/bash

while read jobnum time
do
  # first line
  if [[ -z $prevjobnum ]]; then
    prevjobnum=$jobnum
    starttime=$time
    lasttime=$time
    continue
  fi

  if [[ $prevjobnum == $jobnum ]]; then
    lasttime=$time
  else

    if [[ $starttime == $lasttime ]]; then
      echo "$prevjobnum incomplete log"
    else
      echo "$prevjobnum $starttime $lasttime"
      :
    fi

    prevjobnum=$jobnum
    starttime=$time
    lasttime=$time
  fi

done

if [[ $starttime == $lasttime ]]; then
  echo "$prevjobnum incomplete log"
else
  echo "$prevjobnum $starttime $lasttime"
fi

<强>输出

975700 18:32:32.956 18:32:33.018
975701 incomplete log
975702 18:32:32.987 18:32:33.034