使用xargs并行运行我的函数

时间:2019-07-10 17:04:00

标签: bash parallel-processing gnu-parallel

大家好,我有以下bash脚本,可从hmmer3软件调用hmmscan。 hmmscan需要指定6个命令行参数,在这种情况下,我编写的代码如下:

dblink

基本上,我正在遍历目录中找到的文件列表,并在每个文件上运行hmmscan,并且我正在使用此文件名附加输出名称,以便具有与之对应的不同输出名称。我的每个输入文件。

我的问题是循环很长,我想将此进程并行化以根据我在命令行中提供的CPU数量进行扩展。我想使用xargs这样做,因为我没有GNU并行功能,但是我不能安装任何东西,所以使用xargs是很重要的。请帮忙。基本上,我一直沉迷于如何使用xargs调用函数以及如何向其传递许多命令行参数。

1 个答案:

答案 0 :(得分:0)

我假设您有权访问允许安装软件的开发机器。在此安装GNU Parallel> 20180222。

然后您运行:

parallel --embed > myscript.sh

然后将myscript.sh的最后几行更改为:

hmmscan_fun () {
    local file=$1
    local marker_profiles=$2
    local n_threads=$3
    local out_dir=$4
    fname=$(echo $file | rev | cut -d'/' -f1 | rev)
    echo 'filename'
    echo $out_dir$fname".txt"
    echo 'n threads'
    echo $n_threads
    echo 'marker profiles'
    echo $marker_profiles
    echo $out_dir$fname".txt" >> $out_dir"out.txt"

    hmmscan -o $out_dir$fname".txt" --tblout $out_dir$fname".hmm" -E 1e-10 --cpu $n_threads $marker_profiles  $file
}
export -f hmmscan_fun

parallel hmmscan_fun {1} {2} 32 myoutdir ::: files* ::: marker1 marker2

然后将脚本移至生产机器并在其中运行。