使用 AWK 将特定时间转换为毫秒

使用 AWK 将特定时间转换为毫秒

我有一个包含数据的文件:

[15:29:58.496640]
[15:29:58.496644]
[15:29:58.496665]
[15:29:58.496682]
[15:29:58.497096]
[15:29:58.498621]

我想要在 CentOS 上使用以毫秒为单位的输出awk

例如:

15:29:58.496640 -> 1499421598.496

尝试过的代码:

awk '{gsub(/[][]/,"");a=$1;x="'"`date -d a +'%s.%3N'`"'"; print x" " a}' file

答案1

我们可以用 , 修剪前括号和右括号tr,然后实际使用awk来非常简单地进行数学计算:

$ tr -d '[]' < input | awk -F: '{secs=$3; secs+=$2*60; secs+=$1*60*60; printf "%.3f\n", secs*1000 }'
55798496.640
55798496.644
55798496.665
55798496.682
55798497.096
55798498.621

为了显示输入和输出(将大括号加回去),我们只需扩展该printf语句:

$ tr -d '[]' < input | awk -F: '{secs=$3; secs+=$2*60; secs+=$1*60*60; printf "[%s]\t%.3f\n", $0,secs*1000 }'
[15:29:58.496640]   55798496.640
[15:29:58.496644]   55798496.644
[15:29:58.496665]   55798496.665
[15:29:58.496682]   55798496.682
[15:29:58.497096]   55798497.096
[15:29:58.498621]   55798498.621

答案2

如果没有 awk,一些(不是很好)的可能性可以是使用以下格式格式化秒date并剪切剩余的毫秒sed

$ DATE="15:29:58.498621"
$ echo $(date +%s --date="$DATE" --utc).$(echo $DATE | sed -r "s/.*\.([0-9]{3}).*/\1/g")
1499441398.498

答案3

while 循环:

while read r; do date -d "${r:1:-1}" +%s.%3N ; done < file

输出:

1499430598.496
1499430598.496
1499430598.496
1499430598.496
1499430598.497
1499430598.498

答案4

对现有代码进行了更改:

day=$(date +%d-%b-%y)
awk -v var=$day 'BEGIN{cmd="date +%s.%6N -d "} {gsub(/[][]/,"");a=varFS$1;cmd a|getline var1;print var1;}' file

相关内容