Предполагая, что доступно несколько ядер, простой способ параллельной работы - использовать xargs. В зависимости от вашей конфигурации попробуйте 2, 3, 4, 5, ... пока не найдете оптимальное число. Это предполагает наличие нескольких входных файлов и НЕТ отдельных файлов, которые намного больше, чем все другие файлы.
Обратите внимание, что добавлено 'fflu sh', чтобы строки не были разделены. Это окажет некоторое негативное влияние на производительность, но это необходимо, если вы хотите объединить отдельные входные файлы в единый набор выходных файлов. Эту проблему можно решить, разделив каждый файл, а затем объединив объединенные файлы.
#! /bin/sh
pushd "_test2" > /dev/null
ls * | xargs --max-procs=4 -L1 awk '
BEGIN {
FS=":"
}
{
gsub(/^[ \t"'\'']+|[ \t"'\'']+$/, "")
$0=gensub("[,|;: \t]+",":",1,$0)
if (NF>1 && $1 ~ /^[[:alnum:]_.+-]+@[[:alnum:]_.-]+\.[[:alnum:]]+$/ && $0 ~ /^[\x00-\x7F]*$/)
{
Fpath=tolower(substr($1,1,2))
Fpath=gensub("[^[:alnum:]]","_","g",Fpath)
print $0 >> Fpath
fflush(Fpath)
}
else
print $0 >> "errorfile"
fflush("errorfile")
}' "$FILE"
popd > /dev/null
С практической точки зрения вам может потребоваться создать сценарий awk, например, split.awk
#! /usr/bin/awk -f -
BEGIN {
FS=":"
}
{
gsub(/^[ \t"'\'']+|[ \t"'\'']+$/, "")
$0=gensub("[,|;: \t]+",":",1,$0)
if (NF>1 && $1 ~ /^[[:alnum:]_.+-]+@[[:alnum:]_.-]+\.[[:alnum:]]+$/ && $0 ~ /^[\x00-\x7F]*$/)
{
Fpath=tolower(substr($1,1,2))
Fpath=gensub("[^[:alnum:]]","_","g",Fpath)
print $0 >> Fpath
}
else
print $0 >> "errorfile"
}
И тогда «основной» код будет выглядеть, как показано ниже, проще управлять.
xargs --max-procs=4 -L1 awk -f split.awk