我正在读取 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:NN
mlr
$ 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
推断字段类型,允许我们将其视为字符串而不是数字。
如果给出选项-I
,mlr
将“就地”编辑文件。