$ awk '{ print length }' file | sort -n | uniq -c | awk '{ printf("%d character words: %d\n", $2, $1) }'
2 character words: 3
5 character words: 1
7 character words: 1
O primeiro filtro awk
imprimirá apenas o comprimento de cada linha no arquivo chamado file
. Estou assumindo que este arquivo contém uma palavra por linha.
O sort -n
(classificar as linhas da saída de awk
numericamente em ordem crescente) e uniq -c
(contar o número de vezes que cada linha ocorre consecutivamente) criará a seguinte saída daquela para os dados fornecidos :
3 2
1 5
1 7
Isso é então analisado pelo segundo script awk
, que interpreta cada linha como "número X de linhas com caracteres Y" e produz a saída desejada.
A solução alternativa é fazer tudo em awk
e manter contagens de comprimentos em uma matriz. É uma troca entre eficiência, legibilidade / facilidade de entendimento (e, portanto, manutenibilidade), que solução é a "melhor".
Solução alternativa:
$ awk '{ len[length]++ } END { for (i in len) printf("%d character words: %d\n", i, len[i]) }' file
2 character words: 3
5 character words: 1
7 character words: 1