gnu parallel可以与cat命令和大数组一起使用吗?

时间:2015-06-09 22:30:21

标签: arrays bash parallel-processing cat gnu-parallel

我正在使用bash处理文件中的一长串数据。此文件中有超过300,000行,因此使用gnu parallel可以显着缩短处理时间。

除了主数据文件之外,我还使用了第二个较小的文件,其中包含将在我的代码的每次迭代中使用的数据。该文件包含大约60,000行,每行包含两列。我当前的策略是读取较小文件的每一行,并将列中的数据复制到两个单独的数组中。然后在代码的每次迭代中使用这两个数组。

我似乎无法将gnu并行读取我的数组作为实际数组,但是,尽管遵循bash how to pass array as an argument to a function中说明的代码 以及所述代码的许多其他排列。

我的代码的简化版本如下。所以dar,它只返回一堆空行。如果有人能够解释如何将数组并行解析,我将非常感激。

SCAFF_LENGTH_FILE="${HOME}/ReferenceSequences/P.miniata.Scaffold.lengths.txt"
INPUT_VCF="${HOME}/data/HaplotypeCalling/variants_allOvarySamples.filtered.vcf"
declare -a array_scaffName
declare -a array_scaffLength
z=0
while read -a data LINE; do
    array_scaffName[$z]=${data[0]}
    array_scaffLength[$z]=${data[1]}
    z=$(( $z + 1 ))
done < ${SCAFF_LENGTH_FILE}

WORKING_DIR="${HOME}/*filepath*/codeTest"
TEMP_FILE_DIR="${WORKING_DIR}/TEMP_FILES"
cd $WORKING_DIR
function exon_parse {
    FILE_NUMBER=$1
    TEMP_FILE_DIR=$2
    INPUT_VCF=$3

    scaffName=$4[@]
    scaffName_array=("${!scaffName}")

    scaffLength=$4[@]
    scaffLength_array=("${!scaffLength}")

    echo ${scaffName_array[4]}
    echo ${scaffLength_array[4]}

    }
export -f exon_parse

seq 5 | parallel exon_parse {} $TEMP_FILE_DIR ${INPUT_VCF} array_scaffName array_scaffLength

注意:我使用代码seq 5,因为我的主数据文件已被分解为更小的子文件以帮助处理。我最终希望开发嵌套的gnu并行脚本,并行选择每个子文件,然后使用如下代码:

cat fileName | parallel 'processes' {} other_inputs

并行处理每个子文件中的数据行

1 个答案:

答案 0 :(得分:1)

最明显的解决方案是在函数内移动数组:

INPUT_VCF="${HOME}/data/HaplotypeCalling/variants_allOvarySamples.filtered.vcf"

WORKING_DIR="${HOME}/*filepath*/codeTest"
TEMP_FILE_DIR="${WORKING_DIR}/TEMP_FILES"
cd $WORKING_DIR
function exon_parse {
    FILE_NUMBER=$1
    TEMP_FILE_DIR=$2
    INPUT_VCF=$3
    SCAFF_LENGTH_FILE="${HOME}/ReferenceSequences/P.miniata.Scaffold.lengths.txt"
    declare -a array_scaffName
    declare -a array_scaffLength
    z=0
    while read -a data LINE; do
        array_scaffName[$z]=${data[0]}
        array_scaffLength[$z]=${data[1]}
        z=$(( $z + 1 ))
    done < ${SCAFF_LENGTH_FILE}

    scaffName=$array_scaffName[@]
    scaffName_array=("${!scaffName}")

    scaffLength=$array_scaffLength[@]
    scaffLength_array=("${!scaffLength}")

    echo ${scaffName_array[4]}
    echo ${scaffLength_array[4]}

    }
export -f exon_parse

seq 5 | parallel exon_parse {} $TEMP_FILE_DIR ${INPUT_VCF} array_scaffName array_scaffLength

但是你也可以导入数组:

                import_array () {
                  local func=$1; shift;
                  export $func='() {
                    '"$(for arr in $@; do
                          declare -p $arr|sed '1s/declare -./&g/'
                        done)"'
                  }'
                }

                declare -a indexed='([0]="one" [1]="two")'

                import_array my_importer indexed

                parallel --env my_importer \
                  'my_importer; echo "{}" "${indexed[{}]}"' ::: "${!indexed[@]}"