awk 'BEGIN{RS="[[:space:][:punct:]]"; c=0}
index($0,"a"){c++}
END{print c}'
Usando uma versão de awk que suporta eparadores R ecord S de vários caracteres ( RS ), por exemplo. GNU awk, você pode fazer com que awk leia uma palavra por registro.
Dentro desse registro, a função index(in, string) pesquisa in para a primeira ocorrência de string e retorna o < em posição de caractere> 1-based de onde ele é encontrado. Se não for encontrado, index() retornará 0 . Assim, o valor de retorno pode ser tratado como um teste de condição booleano (0 = falso, não zero = verdadeiro). Note que esta não é uma pesquisa de expressão regular.
Se uma correspondência for encontrada, a variável c será incrementada em 1 ( c++ )
O c=0 é necessário no bloco BEGIN{} , para quando c nunca é incrementado - o que faria com que c fosse null em vez de 0 . Outra maneira de lidar com esse problema seria print 0+c (no bloco END{} )