2016-05-12 19 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'を認識すると、regexはフォルダ内の各bamファイルごとに異なる英数字 'S12816'を認識します –

答えて

0

私の質問への回答が見つかりました。以下はコードです。エレガントなものではありませんが、機能します。 Rscriptはフルネームとフルパスが必要なので、エコーコマンドの出力を変数に初期化し、入力ファイルの引数として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

'' infile'を設定するのに 'echo'を使う必要はありません。 'infile = $ inbam'も同様に動作します。単に 'inbam'を' infile'を全く設定せずにそのまま使うこともできます。 – chepner

+0

'Rscript'はハードコードされたフルパス名と入力' .bam'ファイルのフルネームを受け入れるように設計されているので、この場合は動作しません。だから私は 'infile =' echo $ inbam'というコマンドを置かなければなりませんでした。これはbashの問題ではなく、 '.bam'ファイルの' Rscript'で引数の解析がどのように行われるか –

+0

まず、 '$ inbam'を引用する必要があります:' infile = $(echo "$ inbam ")'。その後、* only * way 'infile'と' inbam'は異なる値を持つことができます。 '$ inbam'に1つ以上の末尾改行が含まれている場合です。 Rscriptはこれとは関係ありません。 – chepner

1

です。findコマンドで正規表現を使用することができます。

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を削除してください。

+0

これは機能しませんが、これはqsubで正しくbashスクリプト内で実行できるはずですか?私の配列を100個のディレクトリとしてqsubを介してbashスクリプトで実行する必要があります –

+0

これはRscriptの問題であることを認識しただけで、bashの名前を受け入れません。 –

+0

@vchris_ngs Rscript 'あなたのニーズに合わせた出力。 – SLePort

関連する問題