Você poderia fazer algo como:
tr ' ' '\n' <infile \
| sort -n \
| uniq -c \
| awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'
Ou até mesmo:
tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c
Ou melhor possível fazer com awk
sozinho:
awk '{ seen[$0]++ }
END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4
Acima em awk
, em seen[$0]++
para cada ecr R , S eparated com espaço ou com% e_line% ewline armazena todo o registro no arquivo associado matriz chamada \n
como chave e seu valor incrementa quando a mesma chave é vista novamente.
No seen
quando todos os registros forem lidos, este bloco será executado e para cada chave (definimos END{ ... }
como índice variável para percorrer todos os elementos nesse array usando para loop) salvo no array visto usamos o valor de visto x
como a chave do novo array chamado seen[x]
e novamente seu incremento de valor para a mesma chave.
Posteriormente, usamos outro loop e count
como índice de variável para imprimir primeiro os valores y
(que são contagens) e count[y]
keys.