Bash 将文本 HHMMSS 转换为 HH:MM:SS

Bash 将文本 HHMMSS 转换为 HH:MM:SS

我正在读取 csv 日志文件,其中时间戳(第一列)的格式为 HHMMSS,其中 HH 是小时 (0-23),MM 是分钟 (0-59),SS 是秒 (0-59) )。

我已经读取了该文件并对列数据进行了各种转换,因此时间戳位于变量中(例如 CURRTYME)。我目前转换如下

# Data will have leading zeros and will always be 6 characters
CURRTYME="073031"
NEXTTYME=`echo $CURRTYME | sed 's/./&:/2'`
LASTTYME=`echo $NEXTTYME| sed 's/./&:/5'`
echo $LASTTYME

这是完成插入的最佳方法还是我可以在一个 sed 语句中完成此操作?

答案1

#!/bin/bash

CURTIME="073031"

echo $CURTIME | sed "s|\(..\)\(..\)\(..\)|\1:\2:\3|"
echo $CURTIME | cut -c-2,3-4,5- --output-delimiter=:

echo ${CURTIME:0:2}:${CURTIME:2:2}:${CURTIME:4:2}

最后一项需要bash.

或者你可以去awk,但是对于这么小的任务来说就有点矫枉过正了

答案2

假设 CSV 文件的标题如下:

time,data A,data B
123456,abba,baab
654321,quux,uxqu

...第一个字段 ,time可以使用 Miller ( ) 转换NNNNNN为 ,如下所示:NN:NN:NNmlr

$ mlr --csv put -S '$time = sub($time,"(..)(..)(..)","\1:\2:\3")' file
time,data A,data B
12:34:56,abba,baab
65:43:21,quux,uxqu

这会将数据读取为 CSV 并使用替换命令 ( sub()) 将命名字段转换time为文件中每条记录所需的格式。

替换将time字段中的前六个字符匹配为三组,每组两个字符,并在组之间插入冒号。子命令-S的选项避免put推断字段类型,允许我们将其视为字符串而不是数字。

如果给出选项-Imlr将“就地”编辑文件。

相关内容