我正在使用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
并行处理每个子文件中的数据行
答案 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[@]}"