我正在尝试编写一个脚本,该脚本应该如下所示,但不知怎的,我无法通过写入方式来放置语法。
我有像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 :(得分: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
感谢大家的建议和意见。我的代码不优雅,但它正在工作,所以我把答案放在这里。