Conte linhas com alfabeto no linux

0

Eu tenho um arquivo com várias linhas em um arquivo filename .

Eu quero contar quantas linhas começam com o caractere 'a', com 'b' e assim por diante de uma só vez.

Qual comando devo executar?

    
por codeofnode 30.08.2013 / 10:26

4 respostas

4

Não sei se entendi a sua pergunta corretamente, é isso que você está procurando?

$ cat foo.input
afoo
abar
bfoo
bbar
bquux
cfoo

$ awk '{a[substr($0, 1, 1)]++}END{for (c in a)print c, a[c]}' foo.input
a 2
b 3
c 1

Outra solução mais simples é usar colrm e uniq :

$ colrm 2 < foo.input | uniq -c
      2 a
      3 b
      1 c
    
por 30.08.2013 / 10:46
2

Este é um trabalho perfeito para uniq :

uniq -c -w 1 filename

-w 1 compara apenas o primeiro caractere de cada linha; -c conta as ocorrências.

Com foo.input da resposta de Adrian você recebe (não se confunda com afoo , bfoo etc; estas são simplesmente as primeiras linhas que começam com a , b , etc.)

    2 afoo
    3 bfoo
    1 cfoo

canalize o resultado por meio de sort -n , se desejar, classificado pelo número de ocorrências:

$ uniq -c -w 1 foo.input | sort -n
    1 cfoo
    2 afoo
    3 bfoo
    
por 30.08.2013 / 11:06
1

Ou, se você estiver mais interessado em perl e grep:

perl -le '$, = "\n"; print ("a".."z")' | xargs -i grep -c '^{}' foo.input
    
por 30.08.2013 / 10:50
1

Outra solução, porque às vezes é mais fácil lembrar de blocos pequenos e montá-los:

$ cat foo.input
afoo
abar
bfoo
bbar
bquux
cfoo

$ cat foo.input | cut -c 1 | tr '[[:upper:]]' '[[:lower:]]' | sort | grep '^[a-z]'| uniq -c
      2 a
      3 b
      1 c

Explicação do one-liner:

  • cat leu o arquivo
  • cut -c 1 apara tudo, menos o primeiro caractere de cada linha
  • tr '[[:upper:]]' '[[:lower:]]' substitui maiúsculas por minúsculas
  • sort ... classifica as linhas
  • grep '^[a-z]' remove linhas que não começam com uma letra
  • uniq -c conta linhas idênticas
por 30.08.2013 / 11:01