如何匹配以下模式的正则表达式?

时间:2016-05-12 16:49:13

标签: regex r bash sh rscript

我正在尝试编写一个脚本,该脚本应该如下所示,但不知怎的,我无法通过写入方式来放置语法。

我有像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

,也无法识别该文件

2 个答案:

答案 0 :(得分: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之前的Rscript

答案 1 :(得分:0)

我找到了我的查询答案,下面是代码。不是优雅的,但它的工作原理。我意识到Rscript需要全名和完整路径所以我只是将echo命令的输出初始化为变量并将其作为输入文件参数传递给Rscript,它获得一个完整的文件名,所以现在它识别输入文件

不是一种优雅的方式,但它仍适用于我。

TRMSim_WSN

感谢大家的建议和意见。我的代码不优雅,但它正在工作,所以我把答案放在这里。