2016-09-30 170 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) 
}