如何为GNU parallel的每个任务添加Yes/No交互式确认提示?
用GNU Parallel批量合并文件时,如何让每个任务等待用户确认后再执行?
我有大量需要合并的测序文件,先用这段Bash代码生成了示例文件:
for lane in $(seq 1 4) do for sub in $(seq 1 8) do echo "sublib ${sub}, lane ${lane}, R1" > S${sub}_L00${lane}_R1.fastq.gz echo "sublib ${sub}, lane ${lane}, R2" > S${sub}_L00${lane}_R2.fastq.gz done done
因为实际文件体积很大,我写了一个shell函数打算用GNU Parallel来并行合并,但希望每个任务执行前弹出Yes/No确认,先核对待合并的文件是否正确。但GNU Parallel是并行执行的,能不能让每个任务暂停下来,等我逐个串行确认后再执行?
我自己写的函数代码如下:
export FQ_DIR="/volume-general/test-fastqs/concat-demo/" function concat_fq () { files=$(find ${FQ_DIR} -type f -name "${1}_L*R${2}*") printf "Files to concatenate: $files " read -p "Proceed? [y/n]?" yn case $yn in [Yy]* ) cat "$files" > ${FQ_DIR}${1}_cat_R${2}.fastq.gz;; [Nn]* ) echo "Aborting.";; esac } export -f concat_fq # example run parallel -k --lb concat_fq {} ::: S1 S2 ::: 1 2
解决方案
核心是强制GNU Parallel串行执行任务,同时保留交互能力:
给parallel命令加上--jobs 1(可简写为-j1)参数,限制同时只运行1个任务,这样每个任务会依次启动,到需要确认的步骤时会暂停等待你的输入。修改后的执行命令:
parallel -k --lb -j1 concat_fq {} ::: S1 S2 ::: 1 2
补充说明
-j1:强制串行执行,确保一个任务完成(包括等待用户确认)后再启动下一个;- 串行模式下,函数里的
read命令能正常捕获终端输入,因为Parallel会把每个任务的标准输入连接到当前终端; - 后续如果不需要确认了,去掉
-j1就能回到并行模式,提升大文件合并的效率。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

