0

当我尝试 grep 某些东西时,我得到:

09:00:02.052(0.0000<-0.0001<-0.0002)
15:04:07.225(75.8901<-78.1234<-79.4567)
16:08:11.463(100.0000<-100.0000<-100.0000)

() 中的值是百分比,所以总是位于 [0, 100]

所以输入格式总是这样的:

HH:MM:SS.mmm(numbers1.xxxx<-numbers2.xxxx<-numbers3.xxxx)

假设日期是 20181025。

是否可以使用 awk/其他 unix 命令将此 grep 结果转换为类似时间序列的 csv 格式:

unixtimestamp1,0.0000,0.0001,0.0002
unixtimestamp2,75.8901,78.1234,79.4567
unixtimestamp3,100.0000,100.0000,100.0000
  • 保证数字始终为 4 位数字。

谢谢!

4

1 回答 1

1

试试这条线:

sed 's/^\(.\+\).(\(.\+\)<-\(.\+\)<-\(.\+\)./printf "%.3f,%s,%s,%s" "$(date  --date="\1" +"%s.%N")" \2 \3 \4/e'

输出得到:

1540537202.050,0.0000,0.0001,0.0002
1540559047.220,75.8901,78.1234,79.4567
1540562891.460,100.0000,100.0000,100.0000

注意:我假设您的本地化 ( LC_ALL) 格式带有点,而不是逗号。否则,请在 sed 命令之前设置此变量:

LC_ALL=C sed 's/^\(.\+\).(\(.\+\)<-\(.\+\)<-\(.\+\)./printf "%.3f,%s,%s,%s" "$(date  --date="\1" +"%s.%N")" \2 \3 \4/e'

要从日期时间字符串中获取时间戳,可以使用命令 date。有关更多详细信息,请参阅此 SO 答案

为了对第一个捕获的组(日期)执行这个命令,我使用了 sede标志,灵感来自这个 SO answer。它允许 sed 获取传递的 shell 命令的输入。

info sed('sed' 脚本 -> "s" 命令) 的更多信息:

此命令允许将来自 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为其输出。尾随换行被抑制;如果要执行的命令包含 NUL 字符,则结果未定义。这是一个 GNU 'sed' 扩展。

所以它可能无法在 GNU 集合之外工作。

于 2018-10-25T17:33:55.527 回答