Carregando ...
Desculpe, ocorreu um erro ao carregar o conteúdo.
 

usando sed pra contar.

Expandir mensagens
  • Thobias Salazar Trevisan
    ae pessoal, estes dias precisei fazer um script para contar quantas vezes uma determinada palavrar aparecia em um texto. que eu saiba não tem nenhum comando
    Mensagem 1 de 3 , 2 de mai de 2003
      ae pessoal,

      estes dias precisei fazer um script para contar quantas vezes uma
      determinada palavrar aparecia em um texto. que eu saiba não tem nenhum
      comando UNIX que te mostre isto, ou tem ?!. assim fiz um script. minha
      primeira idéia foi este script.

      cat file | sed -n \
      '/\b'"$1"'\b/{s/\b'"$1"'\b/¡/g;s/[^¡]//g;H;};
      ${x;:a;s/\n//;ta;s/^[^¡]*\([¡]*\).$/\1/p;}'| wc -c

      ou seja, substituimos a palavra por um caractere maluco, e adicionamos ele
      no reserva. quando chegamos ao final do arquivo, pegamos do reserva,
      deixamos só o caractere maluco e contamos quantas vezes ele
      aparece (wc -c)

      Bom, funciona blz. mas após uma pesquisa na rede, descobri uma maneira de
      incrementar um número usando substituição muito mais simples que alguns
      métodos mirabolantes para fazer isto em sed que encontramos por aí :).
      Então fiz este script para contar quantas vezes uma determinada palavra
      aparece em um texto usando só sed.

      #!/bin/sed -nf

      # se for a primeira linha zeramos o contador.
      # o contador fica sempre no reserva
      1{;x;s/^/0/;x;}

      # se for a palavra que procuramos fizemos
      /\bsed\b/{
      :c
      s/\bsed\b//;ta
      # substituimos a palavra por nada, se ocorreu sucesso na substituição
      # pulamos pro label a, senão, vamos pro label b
      bb
      # chegamos aqui se ocorreu sucesso na substituição. Assim pegamos o valor
      # que esta no reserva e fizemos valor + 1
      :a
      x
      # aqui comeca o algoritmo pra incrementar o numero
      :p
      s/9\(_*\)$/_\1/
      tp
      s/^\(_*\)$/0\1/
      s/ \(_*\)$/0\1/
      s/8\(_*\)$/9\1/
      s/7\(_*\)$/8\1/
      s/6\(_*\)$/7\1/
      s/5\(_*\)$/6\1/
      s/4\(_*\)$/5\1/
      s/3\(_*\)$/4\1/
      s/2\(_*\)$/3\1/
      s/1\(_*\)$/2\1/
      s/0\(_*\)$/1\1/
      s/_/0/g
      # como a palavra pode aparecer mais de 1x na mesma linha, pulamos pro label
      # c pra ver se existe mais
      x;tc
      # aqui termina
      }
      :b
      # se for última linha, imprime o que tem no reserva (o contador)
      ${x;p;}

      Note que estamos usando borda no script (\b), assim se
      procurarmos por sed e tiver sedsed, o resultado vai ser 0
      testando...

      $ echo xxxx | ./count.sed
      0
      $ echo sedxxxx | ./count.sed
      0
      $ echo xxx sed yyy | ./count.sed
      1
      $ echo -e "xxx sed yyy sed \n ttt sed" | ./count.sed
      3

      como achei muito interessante este método resolvi compartilhar
      com vocês, sed lovers :)

      PS: o link pro doc:
      http://www.sens.buffalo.edu/UBiquity/software/gnu/doc/web/
      share/doc/sed/html/Increment-a-number.html

      falow

      thobias
      -------
      echo 9446046325380026818553633794429812592304650P | dc
      -------
      http://www.lcp.coppe.ufrj.br/~thobias

      ____________________________
      |
      | Against - HTML Mail
      | Against - MS ATTACHMENTS
      |
      ----------------------------
    • Mario Domenech Goulart
      Oi ... Me ocorreu colocar cada palavra em uma linha e usar o grep para contar a desejada: Exemplo: $ echo um dois tres um dois tres | sed s/ / n/g | grep
      Mensagem 2 de 3 , 2 de mai de 2003
        Oi

        On 2 May 2003 Thobias Salazar Trevisan wrote:

        >
        >
        > ae pessoal,
        >
        > estes dias precisei fazer um script para contar quantas vezes uma
        > determinada palavrar aparecia em um texto. que eu saiba não tem nenhum
        > comando UNIX que te mostre isto, ou tem ?!. assim fiz um script. minha
        > primeira idéia foi este script.
        >
        > cat file | sed -n \
        > '/\b'"$1"'\b/{s/\b'"$1"'\b/¡/g;s/[^¡]//g;H;};
        > ${x;:a;s/\n//;ta;s/^[^¡]*\([¡]*\).$/\1/p;}'| wc -c
        >
        > ou seja, substituimos a palavra por um caractere maluco, e adicionamos ele
        > no reserva. quando chegamos ao final do arquivo, pegamos do reserva,
        > deixamos só o caractere maluco e contamos quantas vezes ele
        > aparece (wc -c)
        >
        > Bom, funciona blz. mas após uma pesquisa na rede, descobri uma maneira de
        > incrementar um número usando substituição muito mais simples que alguns
        > métodos mirabolantes para fazer isto em sed que encontramos por aí :).
        > Então fiz este script para contar quantas vezes uma determinada palavra
        > aparece em um texto usando só sed.
        >
        > #!/bin/sed -nf
        >
        > # se for a primeira linha zeramos o contador.
        > # o contador fica sempre no reserva
        > 1{;x;s/^/0/;x;}
        >
        > # se for a palavra que procuramos fizemos
        > /\bsed\b/{
        > :c
        > s/\bsed\b//;ta
        > # substituimos a palavra por nada, se ocorreu sucesso na substituição
        > # pulamos pro label a, senão, vamos pro label b
        > bb
        > # chegamos aqui se ocorreu sucesso na substituição. Assim pegamos o valor
        > # que esta no reserva e fizemos valor + 1
        > :a
        > x
        > # aqui comeca o algoritmo pra incrementar o numero
        > :p
        > s/9\(_*\)$/_\1/
        > tp
        > s/^\(_*\)$/0\1/
        > s/ \(_*\)$/0\1/
        > s/8\(_*\)$/9\1/
        > s/7\(_*\)$/8\1/
        > s/6\(_*\)$/7\1/
        > s/5\(_*\)$/6\1/
        > s/4\(_*\)$/5\1/
        > s/3\(_*\)$/4\1/
        > s/2\(_*\)$/3\1/
        > s/1\(_*\)$/2\1/
        > s/0\(_*\)$/1\1/
        > s/_/0/g
        > # como a palavra pode aparecer mais de 1x na mesma linha, pulamos pro label
        > # c pra ver se existe mais
        > x;tc
        > # aqui termina
        > }
        > :b
        > # se for última linha, imprime o que tem no reserva (o contador)
        > ${x;p;}
        >
        > Note que estamos usando borda no script (\b), assim se
        > procurarmos por sed e tiver sedsed, o resultado vai ser 0
        > testando...
        >
        > $ echo xxxx | ./count.sed
        > 0
        > $ echo sedxxxx | ./count.sed
        > 0
        > $ echo xxx sed yyy | ./count.sed
        > 1
        > $ echo -e "xxx sed yyy sed \n ttt sed" | ./count.sed
        > 3
        >
        > como achei muito interessante este método resolvi compartilhar
        > com vocês, sed lovers :)


        Me ocorreu colocar cada palavra em uma linha e usar o grep para contar
        a desejada:

        Exemplo:

        $ echo "um dois tres um dois tres" | sed 's/ /\n/g' | grep -c "um"
        2

        Embora nao seja "sed puro", tambem da', nao?

        Mario

        >
        > PS: o link pro doc:
        > http://www.sens.buffalo.edu/UBiquity/software/gnu/doc/web/
        > share/doc/sed/html/Increment-a-number.html
        >
        > falow
        >
        > thobias
        > -------
        > echo 9446046325380026818553633794429812592304650P | dc
        > -------
        > http://www.lcp.coppe.ufrj.br/~thobias
        >
        > ____________________________
        > |
        > | Against - HTML Mail
        > | Against - MS ATTACHMENTS
        > |
        > ----------------------------
        >
        >
        > --
        > para sair da lista: sed-br-unsubscribe@...
        >
        > Seu uso do Yahoo! Grupos é sujeito às regras descritas em: http://br.yahoo.com/info/utos.html
        >
      • Thobias Salazar Trevisan
        ae mario, ... sim, este sue jeito é mais claro. Mas é que bolei aquela minha primeira tentativa porque estava tentanto fazer usando só sed e usando apenas 1
        Mensagem 3 de 3 , 2 de mai de 2003
          ae mario,

          On Fri, 2 May 2003, Mario Domenech Goulart wrote:

          > > comando UNIX que te mostre isto, ou tem ?!. assim fiz um script. minha
          > > primeira idéia foi este script.
          > >
          > > cat file | sed -n \
          > > '/\b'"$1"'\b/{s/\b'"$1"'\b/¡/g;s/[^¡]//g;H;};
          > > ${x;:a;s/\n//;ta;s/^[^¡]*\([¡]*\).$/\1/p;}'| wc -c
          > >
          > Me ocorreu colocar cada palavra em uma linha e usar o grep para contar
          > a desejada:
          >
          > Exemplo:
          > $ echo "um dois tres um dois tres" | sed 's/ /\n/g' | grep -c "um"
          > 2
          > Embora nao seja "sed puro", tambem da', nao?

          sim, este sue jeito é mais claro. Mas é que bolei aquela minha
          primeira tentativa porque estava tentanto fazer usando só sed e
          usando apenas 1 sed. só que não consegui descobrir uma meneira de
          fazer o wc -c em sed :( aí me deparei com aquele algoritmo.

          Uma outra maneira usando 2 sed é:

          $ echo "um dois tres um dois tres" | sed -n \
          '/\bum\b/{s/\bum\b/¡/g;s/[^¡]//g;H;};${x;s/^\n//;:a;s/\(.\)\1/\1\
          \1/;ta;p;}' | sed -n '$='
          2

          existem mil maneiras de se fazer neston :)

          Abraco!

          thobias
          -------
          echo 9446046325380026818553633794429812592304650P | dc
          -------
          http://www.lcp.coppe.ufrj.br/~thobias

          ____________________________
          |
          | Against - HTML Mail
          | Against - MS ATTACHMENTS
          |
          ----------------------------
        Sua mensagem foi enviada com êxito e será entregue aos destinatários em breve.