在R 中将awk的输出重定向到文件时遇到的问题
我有一个文本文件(data.txt)
lala=something
dada=somethingelse
stuffwithoutequalsign
otherstuffwithoutequalsign
我在R/Rstudio/Win11上通过系统调用来调用awk(已安装gawk 5.3.0),进行解析,以下代码实现了我想要的效果,也就是每条包含等号的记录都会输出到Rstudio控制台:
keys <- paste("awk",
shQuote('/=/ { print }'),
shQuote("data.text"))
system(keys, intern = TRUE)
[1] "lala=something" "dada=somethingelse"
最终,我想把awk的输出重定向到另一个文件(output.txt),但得到的错误信息却并不有用:
keys <- paste("awk",
shQuote('/=/ { print > output.txt }'),
shQuote("data.text"))
system(keys, intern = TRUE)
Warning message:
In system(keys, intern = TRUE) :
running command 'awk "/=/ { print > output.txt }" "data.text"' had status 1
如何实现重定向,以及如何从R 中注入一个包含文件名的字符串变量(如有需要可以包含完整路径),而不是使用硬编码的“output.txt”?此外,最好能够实现跨平台的代码,因为它也可以在其他系统(MacOS、Unix变体)上使用?
解决方案
在意识到解决办法后,我来给出自己的答案。
使用硬编码的文件名(在问题中,我对output.txt没有使用双引号,导致失败):
keys <- paste(paste0("awk"),
shQuote('/=/ { print > "output.txt" }'),
shQuote("data.txt"))
keys <- system(keys, intern = TRUE)
更好的解决方案是,将输入和输出文件名都作为字符串变量,可以从R 传给awk:
output <- "output.txt"
input <- "data.txt"
keys <- paste(paste0("awk -v file=", output),
shQuote('/=/ { print > file }'),
shQuote(input))
system(keys, intern = TRUE)
这里,标志 -v 设定了一个名为file的变量,而paste0那一行将被解析为 -v file="output.txt",这个变量可以在awk代码中调用。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。