Bash while read
l oop, вероятно, является вашим главным узким местом здесь. Вызов нескольких внешних процессов для простого расщепления поля усугубит проблему. Вкратце,
while IFS="|" read -r first second third rest; do ...
использует встроенную в оболочку функцию разделения полей, но, возможно, вы все равно захотите преобразовать все это в простой скрипт Awk.
echo "file_name,symbol,record_count" > "$1"
for f in "/data/myfolder"/*.gz; do
gunzip -c "$f" |
awk -F "\|" -v f="$f" -v OFS="," '
/H/ { if(ctr) print f, sym, ctr
ctr=0; sym=$3;
print sym >"/dev/stderr"
next }
{ ++ctr }'
done >>"$1"
Это неопределенно предполагает, что печать одинокого sym
только для диагностики. Надеемся, что нетрудно понять, как это можно изменить, если это неверное предположение.