我有一个文件有三个不同的时间戳,如下所示。 (我刚刚在这里放了两行。文件有几千行像。)
blah!blah!20190206 12:59:03:579 PM!blah!20190206 12:59:03:691 ……
使用GNU awk实现时间功能:
$ cat tst.awk BEGIN { FS="!"; OFS=" " } { numTs = 0 for (i=3; i<=7; i+=2) { split($i,t,/[[:space:]:]/) date = gensub(/(.{4})(.{2})/,"\\1 \\2 ",1,t[1]) time = ( t[2] + ( (t[6] == "PM") && (t[2] < 12) ? 12 : 0 ) ) " " t[3] " " t[4] secs = mktime(date " " time) ts[++numTs] = $i ms[numTs] = (secs * 1000) + t[5] } print ts[1], ts[2], ts[3] print " " (ms[2] - ms[1]) " milliseconds", (ms[3] - ms[2]) " milliseconds" } $ awk -f tst.awk file 20190206 12:59:03:579 PM 20190206 12:59:03:691 PM 20190206 12:59:06:422 PM 112 milliseconds 2731 milliseconds 20190206 12:59:06:510 PM 20190206 12:59:06:534 PM 20190206 12:59:06:928 PM 24 milliseconds 394 milliseconds
如果 date 无法读取输入,使用 sed 将输入格式化为可以读取的格式。
date
sed
cat <<EOF >file blah!blah!20190206 12:59:03:579 PM!blah!20190206 12:59:03:691 PM!blah!20190206 12:59:06:422 PM!blah!blah blah!blah!20190206 12:59:06:510 PM!blah!20190206 12:59:06:534 PM!blah!20190206 12:59:06:928 PM!blah!blah EOF # remove the blah! words to leave only timestamps # so we have: '20190206 12:59:03:579 PM!20190206 12:59:03:691 PM!20190206 12:59:06:422 PM' <file cut -d'!' -f3,5,7 # substitute the parts ':123 ' into '.123 ' so that date knows it's miliseconds # now we have '20190206 12:59:03.579 PM!20190206 12:59:03.691 PM!20190206 12:59:06.422 PM' sed 's/:\([0-9]\{3\} \)/.\1/g' | # read the dates - they are still separated by `!` while IFS='!' read -r d1 d2 d3; do # convert dates into seconds since epoch s1=$(date --date="$d1" +%s.%N) s2=$(date --date="$d2" +%s.%N) s3=$(date --date="$d3" +%s.%N) # compute differences diff21=$(bc <<<"scale=100; $s2 - $s1") diff32=$(bc <<<"scale=100; $s3 - $s2") # nice looking printf - I leave it to OP to extract only miliseconds and such printf "%.3f %.3f\n" "$diff21" "$diff32" done
willl输出:
0.112 2.731 0.024 0.394
最后我很开心 xargs ,这是相同的使用 xargs :
xargs
<file cut -d'!' -f3,5,7 | sed 's/:\([0-9]\{3\} \)/.\1/g' | # substitute `!` for a newline tr '!' '\n' | # run date on each input line converting to seconds xargs -i date --date={} +%s.%N | # prepare for bc xargs -n3 sh -c 'printf "%s-%s\n%s-%s\n" "$2" "$1" "$3" "$2"' -- | # compute differences for each line xargs -n1 sh -c 'bc <<<"$@"' -- | # nice looking printf xargs -n2 printf -- "%.3f %.3f\n"
它看起来更整洁。