$ 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 awk
filtro 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 awk
numericamente 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 awk
script 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 awk
e 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