Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对awk的R系统调用失败_R_Bash_Awk - Fatal编程技术网

对awk的R系统调用失败

对awk的R系统调用失败,r,bash,awk,R,Bash,Awk,我有一个日志文件,我们叫它mylogfile.txt 格式是 日期时间戳,然后是分号分隔符,然后是其他一些我不关心的东西,就本练习而言 例如(这是日志文件中的全部一行-不确定如何在道歉中这样表示) 我目前尝试的只是一个概念验证示例。我希望解析文件,颠倒行顺序,并在输出中返回两列- 1) 只是从第1列解析的时间戳(这是一种日期时间格式,因此我需要放弃日期部分) 2) 从午夜开始以秒表示的时间戳,以毫秒精度表示(和时间戳本身的粒度一致) 因此,从下面的单线示例中,输出为eg 23:59:43.158

我有一个日志文件,我们叫它mylogfile.txt

格式是 日期时间戳,然后是分号分隔符,然后是其他一些我不关心的东西,就本练习而言

例如(这是日志文件中的全部一行-不确定如何在道歉中这样表示)

我目前尝试的只是一个概念验证示例。我希望解析文件,颠倒行顺序,并在输出中返回两列-

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

2) 从午夜开始以秒表示的时间戳,以毫秒精度表示(和时间戳本身的粒度一致)

因此,从下面的单线示例中,输出为eg

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))

testawk在尝试将其他语言与R一起使用时,例如Python,经常会发生这种情况。如果您没有将路径添加到Windows系统路径,那么您就没有告诉RStudio在哪里可以找到可执行文件

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

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

注意:这不会永久添加,因此您必须在每个会话开始时启动或永久识别它。

在尝试将其他语言与R(例如Python)一起使用时,通常会发生这种情况。如果您没有将路径添加到Windows系统路径,则您没有告诉RStudio在何处查找可执行文件

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

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

注意:这不会永久添加,因此您必须在每次会话开始时启动或永久识别它。

听起来好像根本找不到“awk”,可能它不在您的路径中。请尝试输入awk的完整路径,例如/usr/bin/awk。我没有使用Windows和Cygwin,因此您的实际路径肯定会不同。

像“awk”这样的ound根本找不到,可能它不在您的路径中。请尝试输入awk的完整路径,例如/usr/bin/awk。我没有使用Windows和Cygwin,因此您的实际路径肯定会有所不同。

只需在R中执行所有操作:

c(
  "20170710-10:31:26.121;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#",
  "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#"
) -> 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=""
)
而且,您可以
cat
将其存储到文件或存储在数据帧中(等等)

我想您可能更熟悉
awk
,但使用它绝对没有意义。

只需在R:

c(
  "20170710-10:31:26.121;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#",
  "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#"
) -> 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=""
)
而且,您可以
cat
将其存储到文件或存储在数据帧中(等等)


我想你可能更熟悉
awk
,但使用它绝对没有意义。

为什么要使用
awk
呢?你可以在R中不费吹灰之力地使用它。为什么要在R中使用
awk
呢?你可以在R中不费吹灰之力地使用它。/usr/bin/awk已返回。我将添加这一点。谢谢(也请参见下面的海报)。遗憾的是,它不起作用。仍然出现“未找到awk”错误。由于我正在windows box上运行所有这些,我是否需要一个更“windowey”的文件路径?好的,谢谢。原来它是在c:/installs/cygwin64/bin/awk中,所以我尝试使用它运行命令。仍然没有乐趣。尝试重新启动RStudio。是否使用大写c?您还需要每隔一段时间运行该命令当你重新启动RStudio时,因为这不会永久地添加到路径中。好吧,从另一个角度来看,成功了。我查看了awk可执行文件,它似乎只是一个到gawk的链接。因此我尝试使用gawk调用R命令,这似乎很好。就每次都需要运行该命令而言,我想我可以轻松地nough将它添加到我的启动脚本中,这是我日常工作的一部分。非常感谢您的帮助。最终到达了那里。/usr/bin/awk已返回。我将添加它。谢谢(还有下面的海报)。遗憾的是,它不起作用。仍然出现“未找到awk”错误。由于我正在windows box上运行所有这些,我是否需要一个更“windowey”的文件路径?好的,谢谢。原来它是在c:/installs/cygwin64/bin/awk中,所以我尝试使用它运行命令。仍然没有乐趣。尝试重新启动RStudio。是否使用大写c?您还需要每隔一段时间运行该命令当你重新启动RStudio时,因为这不会永久地添加到路径中。好吧,从另一个角度来看,成功了。我查看了awk可执行文件,它似乎只是一个到gawk的链接。因此我尝试使用gawk调用R命令,这似乎很好。就每次都需要运行该命令而言,我想我可以轻松地不,把它添加到我的启动脚本中,这是我日常工作的一部分。非常感谢你的帮助。最终达到了目的。谢谢。我确实知道如何在R中做这件事,但问题是具体如何调用awk。正如我前面所说的,那个特定的例子只是那个。一个例子。我还有其他用例。谢谢。我确实知道如何调用awk在R中做这件事,但问题是具体如何调用awk。正如我前面所说的,那个特定的例子仅仅是那个。一个例子。我还有其他的用例。
10:31:26.121,37886.121
23:59:43.158,86383.158