2017-08-01 45 views
0

我有一个日志文件,姑且称之为mylogfile.txtR系统调用AWK失败

格式是 日期戳,然后分号分隔符,然后一些其他的东西,我,为这项工作的目的,漠不关心。

例如,(这是在日志文件中的所有一行 - 不知道如何在SO表现为这样所以道歉)

20170710-23:59:43.158;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156# 

什么我目前试图简单地说就是概念实例的证明。我希望解析文件,颠倒行顺序,并返回输出中的两列 -

1)只是从第一列解析的时间戳(这是一个日期时间格式,所以我需要放弃日期部分)

2)在自午夜秒表示即时间戳,表示以毫秒精度(符合时间戳本身的粒度。

从输出下面的单线例子是例如

所以

23:59:43.158,86383.158 

我c一半在那里。我可以使用在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脚本中,并简单地调用它的脚本它可能工作,但我很沮丧,我不能简单地找到正确的语法来直接调用awk R系统命令(我处理grep,sed等命令等)。

这不像awk实际上根本不被支持那么简单吗?

指针非常感谢。如果第一个说20行的日志文件是有用的,我也可以发布这些。

+1

为什么你想使用'awk'呢?你可以在没有太多痛苦的情况下做到这一点。 – nicola

回答

1

当尝试在R中使用其他语言时,经常会发生这种情况。蟒蛇。如果您尚未将路径添加到Windows系统路径,那么您还没有告诉RStudio在哪里查找可执行文件。

Cygwin的根目录通常位于C:\cygwin64(但可能因您的安装而异),因此请查找安装并查找bin文件夹。在应该有awk的可执行文件,但它通常只是一个符号链接到gawk可执行文件(身份验证),以便添加到路径,例如:

Sys.setenv(PATH = paste("C:/cygwin64/bin/gawk", Sys.getenv("PATH"), sep = ":")) 

注意:这不会永久添加,所以你必须启动在每个会议开始时或add to your Windows path将其永久识别。

+0

/usr/bin/awk已返回。我会补充一点。谢谢(以及下面的海报)。 – Pascoe

+0

可悲的是没有工作。仍然没有找到awk错误。由于我在Windows窗口中运行所有这些,我是否需要更多'windowey'文件路径? – Pascoe

+0

@Pascoe请参阅我的编辑 – mlegge

1

听起来像'awk'根本找不到,也许它不在你的PATH中。尝试将awk的完整路径放入,例如'在/ usr /斌/的awk'。我没有使用Windows和Cygwin,所以你的真正路径肯定会有所不同。

0

只要做到这一切在R:

c(
    "20170710-10:31:26.121;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#", 
    "20170710-23:59:43.158;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#" 
) -> log_lines 

# you'd get the above with `log_lines <- readLines('filename')` 

matched <- stringi::stri_match_first_regex(log_lines, "([[:digit:]]+:[[:digit:]]+:[[:digit:]]+\\.[[:digit:]]+)")[,2] 

cat(
    rev(
    sprintf(
     "%s,%s\n", 
     matched, 
     lubridate::hms(matched) %>% 
     as.numeric() %>% 
     sprintf("%9.3f", .) 
    ) 
), 
    sep="" 
) 

这使得:

10:31:26.121,37886.121 
23:59:43.158,86383.158 

而且,您可以cat到文件或存储在数据帧(等)。

我很高兴可能对您更为熟悉,但它绝对没有意义使用它。

+0

谢谢。我知道如何在R中做这件事,但问题是如何调用awk。正如我前面所说,那个特殊的例子就是这个。一个例子。我还有其他用例。 – Pascoe