2012-07-09 231 views
13

所以我有這個程序samtools,我想從cmd行使用,將一個文件轉換爲另一個。它的工作原理是這樣的:從R腳本運行bash腳本

bash-4.2$ samtools view filename.bam | awk '{OFS="\t"; print ">"$1"\n"$10}' - > filename.fasta 

因爲我想自動執行此操作,我想通過使用R腳本來自動執行此操作。我知道你可以使用system()來運行一個操作系統命令,但我不能得到它試圖

system(samtools view filename.bam | awk '{OFS="\t"; print ">"$1"\n"$10}' - > filename.fasta) 

工作難道僅僅是一個使用正則表達式來擺脫空間和東西,所以逗號次爭論的事系統(命令)是否可讀?我該怎麼做呢?

編輯:

system("samtools view filename.bam | awk '{OFS="\t"; print ">"$1"\n"$10}' - > first_batch_1.fasta") Error: unexpected input in "system("samtools view filename.bam | awk '{OFS="\"

EDIT2:

system("samtools view filename.bam | awk '{OFS=\"\t\"; print \">\"$1\"\n\"$10}' - > filename.fasta")

awk: cmd. line:1: {OFS=" "; print ">"$1" 
awk: cmd. line:1:      ^unterminated string 
awk: cmd. line:1: {OFS=" "; print ">"$1" 
awk: cmd. line:1:      ^syntax error 
> 

EDIT3: 與獲獎者是:

system("samtools view filename.bam | awk '{OFS=\"\\t\"; print \">\"$1\"\\n\"$10}' -> filename.fasta") 
+1

'系統()'需要一個字符串作爲參數,所以你需要用引號包裝你的論點。 – Andrie 2012-07-09 12:43:18

+0

我已經試過了。如上面的編輯所示。 – cianius 2012-07-09 12:47:05

+1

try system(「samtools view filename.bam | awk'{OFS = \」\ t \「; print \」> \「$ 1 \」\ n \「$ 10}' - > filename.fasta」)您需要轉義雙引號,以便R讀取整個命令,而不是隻有前兩個雙引號之間的命令部分 – 2012-07-09 12:50:59

回答

22

調試這是使用cat的方式測試您的字符串是否已正確轉義。所以:

  1. 與您的字符串
  2. 小心逃避所有的特殊字符創建一個對象x,在這種情況下引號和反斜線
  3. 使用cat(x)檢查結果字符串。

例如:

x <- 'samtools view filename.bam | awk \'{OFS="\\t"; print ">"$1"\\n"$10}\' - > filename.fasta' 

cat(x) 
samtools view filename.bam | awk '{OFS="\t"; print ">"$1"\n"$10}' - > filename.fasta 

如果這給正確的字符串,那麼你應該能夠使用

system(x) 
+0

是的,我需要學習如何自己調試。謝謝Andrie! – cianius 2012-07-09 13:15:38

+1

@Andrie我在名爲''test.sh''的''c:/test''文件夾中安裝了一個bash腳本。我想用r代碼來調用這個bash腳本。我嘗試這個''系統'命令,但得到一個錯誤親愛的你會幫助我嗎? – 2017-02-25 09:28:57