O utilitário grep
não permite que você faça isso da caixa, portanto, nesse caso, você terá que recorrer a um loop.
Algo nas linhas disso fará o truque:
i=0
while read -r pattern; do
outfile="data-$(( i++ )).out"
fgrep -w "$pattern" data.in >$outfile
if [ ! -s $outfile ]; then
rm $outfile
fi
done <patterns.in
Isso também remove todos os arquivos vazios (de padrões que não correspondem).