优化逐行bash函数的并行化

时间:2016-01-05 02:25:29

标签: bash function gnu-parallel

我有大量需要重新格式化的大小为2-10GB的文件,而目前我所使用的bash脚本对于单个文件只需要1天。将文件重定向到3<似乎更多的开销,所以我评论说出来了。我在这个脚本中有几个其他函数生成$ {KEYS [@]},但我真的需要建议如何优化下面的函数来提高速度。

目的是重新格式化不以指定$ INPUT_FILE的注释开头的行。我正在尝试找到并行化此功能的最快方法,并期望它一次执行8行功能(8个CPU)。

#!/bin/bash

function reformat {
    #while read -u 3 -r line; do
    while read -r line; do
        semicolVals=$(echo $line | awk '{print $12}')    
        IFS=';' read -r -a SCV -d '' < <(printf '%s' "${semicolVals[@]}")
        VALS=()
        for k in "${KEYS[@]}"; do
            if grep -q "$k=" <<< "${SCV[@]}"; then
                str="${SCV[@]}"
                VAL=${str##*$k=}
                VAL=${VAL%%[[:space:]]*}
                VALS+=("$VAL")
            else
                VAL='0'
                VALS+=("$VAL")
            fi
        done

        outKEY=$(printf ":%s" "${KEYS[@]}")
        outKEY=${outKEY:1}
        outVAL=$(printf ":%s" "${VALS[@]}")
        outVAL=${outVAL:1}
        ColA=$(echo $line | awk '{print $1}')
        ColB=$(echo $line | awk '{print $2}')
        ColC=$(echo $line | awk '{print $3}')
        ColD=$(echo $line | awk '{print $4}')
        ColE=$(echo $line | awk '{print $5}')
        ColF=$(echo $line | awk '{print $6}')
        ColG=$(echo $line | awk '{print $7}')

        if [[ "$RETAIN" -eq 1 ]]; then
            ColH="$semicolVals"
        else
            ColH='0'
        fi

        printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \
        "$ColA" "$ColB" "$ColC" "$ColD" "$ColE" "$ColF" "$ColG" "$ColH" "${outKEY[@]}" "${outVAL[@]}"
    done
}

export -f reformat
#exec 3< <(grep -v -e '^#' "$INPUT_FILE")
#parallel -j 8 ::: reformat
#exec 3<&- 
grep -v -e '^#' "$INPUT_FILE" | parallel -j 8 ::: reformat

0 个答案:

没有答案