首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配以下模式的正则表达式?

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

Stack Overflow用户
提问于 2016-05-12 16:49:12
回答 2查看 131关注 0票数 0

我正在尝试写一个脚本,它应该像下面这样工作,但是不知怎么的,我无法得到写的方式来放置语法。

我有像S_12_O_319_K4me1这样的文件夹。

而每个文件夹中的内容都是S_12_O_319_K4me1_S12816.sorted.bam

因此,我想编写一个脚本,在这个脚本中,我的脚本进入循环中同名文件夹,然后标识*.bam文件并执行操作,但我无法将正则表达式放入其中。这就是我试过的:

代码语言:javascript
复制
#!/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

我无法识别与上述正则表达式匹配的数字。

我哪里搞错了?

编辑:我在下面尝试过

代码语言:javascript
复制
#!/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"

错误

代码语言:javascript
复制
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,也不识别该文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-13 13:33:30

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

这不是一种优雅的方式,但对我来说仍然有效。

代码语言:javascript
复制
#!/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
EN

Stack Overflow用户

发布于 2016-05-12 20:37:31

可以在find命令中使用regex:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37192977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档