2016-09-30 136 views
0

我试图让自己的生活更容易一点,但它还没有工作。我正在试图做的是以下几点:在Unix命令行中使用变量

注:我在Unix服务器上运行R,因为我的脚本的其余部分是R.这就是为什么有system(" ")

system("TRAIT=haptoglobin") 

system("grep var.resid.anim rep_model_$TRAIT.out > res_var_anim_$TRAIT'.xout'",wait=T) 

然而,结果是读取文件rep_model_.out并创建了res_var_anim_.xout,但需要读取rep_model_haptoglobin.out并需要创建res_var_anim_haptoglobin.xout

当我在腻子中运行完全相同的东西(当然没有system(" ")),则读取正确的文件并创建正确的输出。当我刚刚删除我创建的变量时,该脚本也适用。但是,我需要多次这样做,所以一个变量对我来说非常方便,但我无法使其工作。

回答

1

此代码不会在控制台上打印任何内容。

system("xxx=foo") 
system("echo $xxx") 

但是下面呢。

system("xxx=foo; echo $xxx") 

只要完成一次“系统”调用,系统就会忘记您的变量定义。

在你的情况,有关努力如何:

system("TRAIT=haptoglobin; grep var.resid.anim rep_model_$TRAIT.out > res_var_anim_$TRAIT'.xout'",wait=T) 
+0

这没有把戏!谢谢 – Lisette

0

你可以把所有这一切在R:

grep_trait <- function(search_for, in_trait, out_trait=in_trait) { 
    l <- readLines(sprintf("rep_model_%s.out", in_trait)) 
    l <- grep(search_for, l, value=TRUE) %>% 
    writeLines(l, sprintf("res_var_anim_%s.xout", out_trait)) 
} 

grep_trait("var.resid.anim", "haptoglobin") 

如果有一个担心,这些文件被读入内存第一(即如果他们是巨大的文件),那么:

grep_trait <- function(search_for, in_trait, out_trait=in_trait) { 
    fin <- file(sprintf("rep_model_%s.out", in_trait), "r") 
    fout <- file(sprintf("res_var_anim_%s.xout", out_trait), "w") 
    repeat { 
    l <- readLines(fin, 1) 
    if (length(l) == 0) break; 
    if (grepl(search_for, l)[1]) writeLines(l, fout) 
    } 
    close(fin) 
    close(fout) 
}