【发布时间】:2017-08-01 12:31:22
【问题描述】:
我有一个日志文件,我们称之为 mylogfile.txt
格式为 日期时间戳,然后是分号分隔符,然后是我不关心的其他内容。
例如(这是日志文件中的所有一行 - 不知道如何在 SO 中呈现,所以道歉)
20170710-23:59:43.158;B@13.43434@1000000.0@20170710-21:15:53.23@@2017071023:59:43.158@@T@20170710-23:59:43.156#B@13.41834@4000000.0@20170710-21:15:53.23@@20170710-23:59:43.158@@T@20170710-23:59:43.156#A@13.47274@1000000.0@20170710-21:15:53.23@@20170710-23:59:43.158@@T@20170710-23:59:43.156#A@13.48874@4000000.0@20170710-21:15:53.23@@20170710-23:59:43.158@@T@20170710-23:59:43.156#
我目前正在尝试的只是一个概念证明示例。我希望解析文件,反转行顺序,并在输出中返回两列 -
1) 只是从第一列解析的时间戳(这是一种日期时间格式,所以我需要丢弃日期部分)
2) 该时间戳以自午夜以来的秒数表示,以毫秒精度表示(与时间戳本身的粒度一致。
所以从下面的单行示例输出将是例如
23:59:43.158,86383.158
我可以走到一半。我可以使用在 cygwin 中运行良好的语法构造对 awk 的调用(自然地剥离了 R 包装器)。但它在 R 中不起作用
testawk<-paste0("tac ", mylogfile.txt, " | awk 'BEGIN {FS=\"-|;|:\"} {OMFT=\"%.3f\"} {print $2 \":\" $3 \":\" $4 \",\" (3600*$2)+(60*$3)+$4}' ")
getawk<-as.data.frame(system(testawk, intern=TRUE, show.output.on.console = FALSE))
然而,数据帧 getawk 中的最终结果只是原始日志文件在读取时翻腾。另外,我收到运行命令状态为 1 的警告消息。
但是
如果我去掉'tac'部分并直接使用awk,那么;
testawk<-paste0("awk 'BEGIN {FS=\"-|;|:\"} {OMFT=\"%.3f\"} {print $2 \":\" $3 \":\" $4 \",\" (3600*$2)+(60*$3)+$4}' ", mylogfile.txt)
getawk<-as.data.frame(system(testawk, intern=TRUE, show.output.on.console = FALSE))
我收到错误消息
Error in system(testawk, intern = TRUE, show.output.on.console = FALSE) :
'awk' not found
我认为问题不在于我的 awk 构造,因为如果我只是在 cygwin 中执行它,它就可以正常工作。所以很明显,我还没有完全掌握 r / system / awk 交互的某些方面。
我想如果我将这一切都包装在一个 awk 脚本中并简单地调用它可能会工作,但我很沮丧我不能简单地找到正确的语法来直接使用 R 系统命令调用 awk(我处理grep、sed 命令等都可以)。
它不像awk那么简单,实际上根本不被支持是吗?
非常感谢指针。如果日志文件的前 20 行有用,我也可以发布。
【问题讨论】:
-
你为什么要使用
awk?您可以在 R 中轻松做到这一点。