gpt4 book ai didi

shell - snakemake 规则调用 shell 脚本但在第一个命令后退出

转载 作者:行者123 更新时间:2023-12-02 02:48:30 28 4
gpt4 key购买 nike

我有一个 shell 脚本,如果我只是从命令行运行它,它运行良好。当我从 snakemake 中的规则调用它时,它失败了。

该脚本在一个标识 rune 件上运行一个 for 循环,并使用这些标识符从 fastq 文件中 grep 序列,然后进行多序列比对并达成共识。

这是脚本。我在那里放了一些 echo 语句,但出于某种原因它没有调用命令。它在 grep 语句处停止。

我试过添加 set +o pipefail;在规则中,但这也不起作用。

 #!/bin/bash


function Usage(){
echo -e "\
Usage: $(basename $0) -r|--read2 -l|--umi-list -f|--outfile \n\
where: ... \n\
" >&2
exit 1
}

# Check argument count
[[ "$#" -lt 2 ]] && Usage
# parse arguments
while [[ "$#" -gt 1 ]];do
case "$1" in
-r|--read2)
READ2="$2"
shift
;;
-l|--umi-list)
UMI="$2"
shift
;;
-f|--outfile)
OUTFILE="$2"
shift
;;
*)
Usage
;;
esac
shift
done

# Set defaults


# Check arguments
[[ -f "${READ2}" ]] || (echo "Cannot find input file ${READ2}, exiting..." >&2; exit 1)
[[ -f "${UMI}" ]] || (echo "Cannot find input file ${UMI}, exiting..." >&2; exit 1)

#Create output directory
OUTDIR=$(dirname "${OUTFILE}")
[[ -d "${OUTDIR}" ]] || (set -x; mkdir -p "${OUTDIR}")


# Make temporary directories
TEMP_DIR="${OUTDIR}/temp"
[[ -d "${TEMP_DIR}" ]] || (set -x; mkdir -p "${TEMP_DIR}")


#RUN consensus script

for f in $( more "${UMI}" | cut -f1);do
NAME=$(echo $f)
grep "${NAME}" "${READ2}" | cut -f1 -d ' ' | sed 's/@M/M/' > "${TEMP_DIR}/${NAME}.name"
echo subsetting reads
seqtk subseq "${READ2}" "${TEMP_DIR}/${NAME}.name" | seqtk seq -A > "${TEMP_DIR}/${NAME}.fasta"

~/software/muscle3.8.31_i86linux64 -msf -in "${TEMP_DIR}/${NAME}.fasta" -out "${TEMP_DIR}/${NAME}.muscle.fasta"

echo make consensus
~/software/EMBOSS-6.6.0/emboss/cons -sequence "${TEMP_DIR}/${NAME}.muscle.fasta" -outseq "${TEMP_DIR}/${NAME}.cons.fasta"

sed -i 's/n//g' "${TEMP_DIR}/${NAME}.cons.fasta"
sed -i "s/EMBOSS_001/${NAME}.cons/" "${TEMP_DIR}/${NAME}.cons.fasta"
done
cat "${TEMP_DIR}/*.cons.fasta" > "${OUTFILE}"

蛇形规​​则:

rule make_consensus:
input:
r2=get_extracted,
lst="{prefix}/{sample}/reads/cell_barcode_umi.count"
output:
fasta="{prefix}/{sample}/reads/fasta/{sample}.R2.consensus.fa"
shell:
"sh ./scripts/make_consensus.sh -r {input.r2} -l {input.lst} -f {output.fasta}"

编辑 Snakemake 错误消息 我将一些路径更改为中性文件路径

RuleException:
CalledProcessError in line 29 of ~/user/scripts/consensus.smk:
Command ' set -euo pipefail; sh ./scripts/make_consensus.sh -r ~/user/file.extracted.fastq -l ~/user/cell_barcode_umi
.count -f ~/user/file.consensus.fa ' returned non-zero exit status 1.
File "~/user/scripts/consensus.smk", line 29, in __rule
_make_consensus
File "~/user/miniconda3/lib/python3.6/concurrent/futures/thread.py", line 56, in run
Shutting down, this might take some time.
Exiting because a job execution failed. Look above for error message

如果有比使用 shell for 循环更好的方法来做到这一点,请告诉我!

谢谢!

编辑

脚本独立运行:首先 grep

grep  AGGCCGTTCT_TGTGGATG R_extracted/wgs_5_OL_debug.R2.extracted.fastq | cut -f1 -d ' ' | sed 's/@M/M/' > ./fasta/temp/AGGCCGTTCT_TGTGGATG.name 

脚本通过 snakemake 运行:前 2 个 grep 语句

grep  :::::::::::::: R_extracted/wgs_5_OL_debug.R2.extracted.fastq | cut -f1 -d ' ' | sed 's/@M/M/' > ./fasta/temp/::::::::::::::.name

我现在正试图弄清楚 snakemake 中的那些:::::是从哪里来的。欢迎所有想法

最佳答案

It stops at the grep statement

我的猜测是 make_consensus.sh 中的 grep 命令没有捕获任何内容。 grep 在这种情况下返回退出代码 1,并且非零退出状态传播到 snakemake。 (另见 Handling SIGPIPE error in snakemake)

松散相关... make_consensus.sh 的 shebang 之间存在不一致,表示脚本应使用 bash (#!/bin/bash) 和使用 sh 的实际执行 (sh ./scripts/make_consensus.sh)。 (在实践中,它不应该有任何区别,因为 sh 可能无论如何都被重定向到 bash)

关于shell - snakemake 规则调用 shell 脚本但在第一个命令后退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243735/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com