$ 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 awkfiltro apenas imprimirá 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 awknumericamente em ordem crescente) e uniq -c(contar o número de vezes que cada linha ocorre consecutivamente) criará a seguinte saída para os dados fornecidos:
3 2
1 5
1 7
Isso é analisado pelo segundo awkscript 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 isso awke manter contagens de comprimentos em uma matriz. É uma troca entre eficiência, legibilidade / facilidade de entendimento (e, portanto, capacidade de manutenção) de qual 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