Contar o número de vezes que cada linha se repete, no caso de forma insensível

0

Eu tenho um arquivo como

a
A
b
c

Eu quero imprimir o número de vezes que cada linha se repete de maneira insensível a maiúsculas e minúsculas. Eu encontrei o comando abaixo para ser útil:

tr A-Z a-z | uniq -c | sed -e 's/^ *//' -e 's/ *$//'

Mas falha se o arquivo estiver no formato A \n a . Isso dá 2 a . Mas a saída esperada é 2 A

Como posso fazer isso?

    
por WannaBeCoder 09.12.2014 / 08:07

1 resposta

1

Primeiro de tudo você tem que usar o comando sort antes de usar uniq -c porque este comando falha se você tiver outros caracteres repetidos depois de outros caracteres como entrada:

a
A
b
c
A
a
a

E o segundo problema é que você obtém resultado errado porque converte todas as letras maiúsculas em minúsculas, porque você obtém resultados em letras minúsculas.

Além disso, você não precisa de 's/ *$//' parte do sed porque sua saída não possui espaços no final das linhas.

Você deve tentar com seu comando modificado como este:

tr a-z A-Z <file |sort | uniq -c | sed 's/^ *//'

Ou tente ainda mais curto:

sort -r file |uniq -ci

sort com sua opção -r classifica caracteres maiúsculos como primeiras linhas. e com uniq e sua opção -i ignora diferenças no caso.

    
por 09.12.2014 / 08:30