2016-05-12 83 views
0

我想寫一個腳本,應該像下面這樣工作,但不知何故我無法獲得寫入方式來放置語法。如何匹配以下模式的正則表達式?

我有像S_12_O_319_K4me1這樣的文件夾。

雖然在每個文件夾中的內容是S_12_O_319_K4me1_S12816.sorted.bam

所以我想編寫一個腳本,我的腳本在一個循環中進入我的同名文件夾,然後標識*.bam文件並執行操作,但我無法放置正則表達式。這是我試過的:

#!/bin/bash 
#$ -S /bin/bash 

spp_run=/path/phantompeakqualtools/run_spp.R 
bam_loc=/path/ChIP-Seq/output 

samples="S_12_O_319_K27me3 
S_12_O_319_K4me1 
S_12_O_319_K4me3 
S_12_O_319_K27ac" 

for s in $samples; do 

    echo "Running SPP on $s ..." 
    Rscript $spp_run -c=$bam_loc/$s/${s}_S[[0-9]+\.sorted.bam -savp -out=$bam_loc/$s/${s}".run_spp.out" 
done 

我無法識別上述正則表達式匹配的數字。

我在哪裏弄錯了?

編輯: 下面我試過它仍然不會在RSCRIPT工作,問題解析,但爲什麼會這樣是

#!/bin/bash 
#$ -S /bin/bash 

spp_run=/path/tools/phantompeakqualtools/run_spp.R 
bam_loc=/path/ChIP-Seq/output 

samples="S_12_O_319_K27me3 
S_12_O_319_K4me1 
S_12_O_319_K4me3" 

for s in $samples; do 
    echo "Running SPP on $s ..." 
    echo $bam_loc/$s/${s}_S*.sorted.bam 
    inbam=$bam_loc/$s/${s}_S*.sorted.bam 
    echo $inbam 
    Rscript $spp_run -c=$inbam -savp -out=$bam_loc/$s/${s}".run_spp.out" 
done 
echo "done" 

錯誤

Error in parse.arguments(args) : 
    ChIP File:/path/ChIP-Seq/output/S_12_O_319_K27me3/S_12_O_319_K27me3_S*.sorted.bam does not exist 
Execution halted 

不認識的文件有問題即使$inbam的值爲/path/ChIP-Seq/output/S_12_O_319_K27me3/S_12_O_319_K27me3_S12815.sorted.bam

+0

你在期待什麼是在命令中解釋該位置的正則表達式? (你似乎錯過了你正則表達式的嘗試。) –

+0

你只是試圖將'$ {s} _S * sorted.bam'文件放在一起嗎? –

+0

正試圖讓Rscript拿起目錄'$ s'中的bam文件,並且識別出'S_12_O_319_K4me1_S12816.sorted.bam',其中正則表達式將理解字母數字的'S12816',它對文件夾內的每個bam文件都有所不同 –

回答

0

我找到了我的查詢答案,下面是代碼。不是一個優雅的,但它的工作原理。我意識到Rscript需要全名和完整路徑,所以我剛剛將echo命令的輸出初始化爲一個變量,並將其作爲輸入文件參數傳遞給Rscript,並獲得完整路徑和完整文件名,以便它現在識別輸入文件。

不是一個優雅的方式,但它仍然適用於我。

#!/bin/bash 
#$ -S /bin/bash 

spp_run=/path/tools/phantompeakqualtools/run_spp.R 
bam_loc=/path/ChIP-Seq/output 

samples="S_12_O_319_K27me3 
S_12_O_319_K4me1 
S_12_O_319_K4me3" 

for s in $samples; do 
    echo "Running SPP on $s ..." 
    echo $bam_loc/$s/${s}_S*.sorted.bam 
    inbam=$bam_loc/$s/${s}_S*.sorted.bam 
    echo $inbam 
    infile=`echo $inbam` 
    Rscript $spp_run -c=$infile -savp -out=$bam_loc/$s/${s}".run_spp.out" 
done 
echo "done" 

感謝大家的建議和意見。我的代碼不是很優雅,但它工作,所以我把答案放在這裏。

+0

沒有必要使用'echo'來設置'infile'; 'infile = $ inbam'也適用。你也可以直接使用'inbam',而不用設置'infile'。 – chepner

+0

不會,在這種情況下它不起作用,因爲'Rscript'的設計方式是它可以接受硬編碼的全路徑名和輸入'.bam'文件的全名。所以我不得不把命令'infile ='echo $ inbam'否則以前的代碼也可以工作。它不是bash的問題,而是在'Rscript'中爲輸入的'.bam'文件如何進行參數解析 –

+0

首先,您應該引用'$ inbam':'infile = $(echo「$ inbam 「)'。之後,* only *方式'infile'和'inbam'可以有不同的值,如果'$ inbam'包含一個或多個尾隨換行符,這裏就不是這種情況。 Rscript與此無關。 – chepner

1

您可以在查找命令中使用正則表達式:

export spp_run=/path/phantompeakqualtools/run_spp.R 
export bam_loc=/path/ChIP-Seq/output 
export dir 

samples=(S_12_O_319_K27me3 S_12_O_319_K4me1 S_12_O_319_K4me3 S_12_O_319_K27ac) 

for dir in ${samples[@]}; do 
    find . -type f -regex ".*/*${dir}_S[0-9]+\.sorted\.bam" \ 
    -exec bash -c 'echo Rscript $spp_run -c=$bam_loc/${dir}/${1##*/} -savp -out=$bam_loc/${dir}/${dir}".run_spp.out"' _ {} \; 
done 

注意:如果輸出滿足您的需求,只需刪除echo之前Rscript

+0

沒有這不起作用,這應該能夠在qsub右邊的bash腳本中運行嗎?我的數組爲100個這樣的目錄,所以我需要通過qsub在bash腳本中運行它們。 –

+0

沒有意識到它是Rscript的問題,它不接受名稱爲bash –

+0

@vchris_ngs您可以自由修改'Rscript '輸出滿足您的需求。 – SLePort