Если файлы не слишком большие:
zgrep -f number_list.csv {voice,sms,data}*20170301*gz |
awk -F'|' '{print $22}' | sort -u
В grep использование переключателя -m позволяет остановить чтение файла после X строк. Например, grep -m 2 остановится после нахождения 2 совпадений. В вашем случае вы должны использовать grep -m 1, чтобы остановиться после первого совпадения. Команда grep, которая находит совпадение, вернет успешный код выхода, в то время как команда grep, которая не обнаружит совпадений, с ненулевым значением. Вы можете использовать блоки if / then / elif / fi или [[test]], чтобы предотвратить выполнение последних команд grep, если первый grep возвращает результат успешно.
TEMP=`zgrep -m 1 -f number_list.csv voice*20170301*gz`
[[ "$TEMP" ]] || TEMP=`zgrep -m 1 -f number_list.csv sms*20170301*gz`
[[ "$TEMP" ]] || TEMP=`zgrep -m 1 -f number_list.csv data*20170301*gz`
echo "$TEMP" | awk -F "|" '{print $22}' >> register_20170301.csv
while read phone_number
do
for file in data*20170301*gz
do
zgrep -q "${phone_number}" "${file}"
if [ "$?" -eq "0" ]
then
zgrep -q "${phone_number}" ${file} >> register_20170301.csv
break;
fi
done
done < number_list.csv