我有大量需要重新格式化的大小为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