shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Erro num script pra contar frequência das palavras


From: Helton Moraes
Subject: Re: [shell-script] Erro num script pra contar frequência das palavras
Date: Tue, 11 May 2010 00:07:05 -0300

Buenas! Obrigado pelas dicas!

Provavelmente nos próximos dias vou reler mais a fundo minha mais nova
aquisição, o livro de shell do Aurélio, e botar em prática as recomendações
dele e do Julio.

Quem sabe não publico o script (ou, mais provável, quem sabe eu não me
interesso por algum outro problema e deixo esse pela metade... ;o)

Outra idéia que me ocorreu seria fazer uma filtragem pelas palavras de mais
de tantos caracteres que ocorrem apenas uma vez. Seria um script para
detectar palavras raras em um texto, ou mesmo para testar o nível de
"academicismo" do mesmo - quem sabe criando um índice de pedantismo para o
autor, hehehe.

Enfim, muitíssimo grato pela ajuda e pelas dicas (aguardem o script...)

Helton



Em 10 de maio de 2010 23:06, Julio C. Neves <address@hidden>escreveu:

> Helton,
> esse getopts ao qual o Law se referiu, está super explicado
> aqui<
> http://wiki.softwarelivre.org/TWikiBar/TWikiBarPapo010#Comando_getopts>
> .
> Abraços,
> Julio
> Cursos de Shell e Zenity em 2 fins de semana?
> - Aracaju turma de Shell em 12/05 - address@hidden;
> - DF turma de Shell em 12/06 - ligue (61)3223-3000;
> - RJ turma de Shell em 14/06 - ligue (21)2210-6061;
> - Floripa turma de Shell e Zenity 12/07 – address@hidden;
> - Turmas fechadas em outras cidades ligue (21)8112-9988.
>
>
> Em 10 de maio de 2010 19:17, Lawrence Waclawiak
> <address@hidden>escreveu:
>
> > Amigo, com certeza você pode criar uma opção no seu script para
> > adicionar as palavras na lista "negra" porém a idéia de adicionar essas
> > palavras no próprio script(Carregar em uma variável) não me parece ser
> > uma boa idéia pois além de trabalhoso seria perigoso e desnecessário.
> > Seria muito mais simples e eficiente vc criar um arquivo adicional para
> > cada tipo de lista que deseje criar.
> >
> > Para fazer o esquema de "--include palavra" pesquise a respeito do
> > getopts, com ele vc pode passar vários parametros identificados para o
> > teu script e tomar decisões de como proceder dependendo de qual
> > parâmetro foi passado.
> >
> >
> > Abraços
> > Helton Moraes escreveu:
> > > Dando continuidade a algo que poderá crescer, crescer...
> > >
> > > Julio, então estou pensando em fazer o seguinte (só que obviamente
> > preciso
> > > de uma luz):
> > >
> > > 1) incluir a lista de palavras num determinado trecho do próprio
> arquivo
> > do
> > > script 'statex';
> > > 2) incluir uma opção que edita o próprio arquivo (isso existe?).
> > >
> > > assim, se eu quisesse incluir a palavra <para> na lista negra, usaria
> > algo
> > > do tipo
> > >
> > > statex --include para
> > >
> > > novamente, pergunto: isso existe? (opção que altera o próprio script)?
> > >
> > > Obrigado
> > >
> > > Helton (lembrando sempre que em shell não se pergunta se tem como
> fazer,
> > e
> > > sim como é que se faz :oP)
> > >
> > >
> > >
> > >
> > > Em 10 de maio de 2010 17:24, Julio C. Neves <address@hidden
> > >escreveu:
> > >
> > >
> > >> Helton,
> > >> eu não limitaria em palavras maiores de 5 caracteres. Eu criaria um
> > arquivo
> > >> chamado MenosEssas que teria todas as palavras que vc não quer como
> do,
> > da,
> > >> que, de, o, a, ..., todas antecedidas por um ^ e sucedidas por um $.
> > >>
> > >> Cada vez que vc encontrar uma palavra indesejada, basta inclui-la no
> > >> arquivo
> > >> e reprocessar.
> > >>
> > >> Nesse caso tire aquele aquele trecho de código que tem o limitador {5}
> e
> > >> insira antes de contar (para não perder tempo contando e classificando
> > >> atoa)
> > >> o trecho a seguir:
> > >>
> > >> grep -vf MenosEssas
> > >>
> > >> Outra coisa que vc não pensou é em palavras com hífen e as mesmas
> > palavras
> > >> no singular e plural.
> > >>
> > >> Abraços,
> > >> Julio
> > >> Cursos de Shell e Zenity em 2 fins de semana?
> > >> - Aracaju turma de Shell em 12/05 - address@hidden;
> > >> - DF turma de Shell em 12/06 - ligue (61)3223-3000;
> > >> - RJ turma de Shell em 14/06 - ligue (21)2210-6061;
> > >> - Floripa turma de Shell e Zenity 12/07 – address@hidden;
> > >> - Turmas fechadas em outras cidades ligue (21)8112-9988.
> > >>
> > >>
> > >> Em 10 de maio de 2010 16:47, Helton Moraes <address@hidden>
> > >> escreveu:
> > >>
> > >>
> > >>> Buenas!
> > >>>
> > >>> Juntando as dicas que me mandaram, e acrescentando mais algumas
> opções
> > >>> cômodas, o script STATEX (statistics of text ;o) ficou assim (vai que
> > >>>
> > >> seja
> > >>
> > >>> útil pra mais alguém...):
> > >>>
> > >>> tr -s "[:punct:] " "\n" <FlyerVert.txt | tr "[:upper:]" "[:lower:]"
> |\
> > >>>  sort | uniq -c | sort -gr | grep -E '[\ ]+[0-9][0-9]*\
> [[:alpha:]]{5}'
> > >>>
> > >> |\
> > >>
> > >>>  head -n 20
> > >>>
> > >>> comentários:
> > >>> tr -s > colapsa caracteres consecutivos ([:punct:] pega tudo que é
> > >>> pontuação)
> > >>> tr "[:upper:]" "[:lower:]" > troca maiúsculas por minúsculas;
> > >>> sort -gr > o -g é pra que ele ordene por ordem numérica, e o r para
> que
> > >>> venha a ordem numérica ao contrário (decrescente);
> > >>> grep > ali no meio tem um {5}, que foi o valor que escolhi para
> tamanho
> > >>> mínimo de palavra (senão as mais frequentes são sempre e, os, as, de,
> > >>>
> > >> por,
> > >>
> > >>> para, etc.). A regex pega algum número seguido de um espaço seguido
> de
> > >>>
> > >> uma
> > >>
> > >>> palavra com 5 caracteres, na ordem que veio do sort
> > >>> head > mostra só os resultados mais importantes (os primeiros)
> > >>>
> > >>> notar que pro tr a sintaxe é [:class:] enquanto pro grep é
> [[:class:]]
> > >>> (haja
> > >>> atenção...).
> > >>>
> > >>> evidentemente a cereja no bolo é trocar o '5' e o '20' por $2 e $3,
> > >>> deixando
> > >>> o $1 para o nome de arquivo, e salvar como um script que aceite
> > >>>
> > >> parâmetros.
> > >>
> > >>> Desculpem se fui muito elementar
> > >>>
> > >>> Helton
> > >>>
> > >>>
> > >>>
> > >>> Em 10 de maio de 2010 14:56, Julio C. Neves <address@hidden
> > >>>
> > >>>> escreveu:
> > >>>>
> > >>>> Fala Helton,
> > >>>> acho que vc queria fazer:
> > >>>> $ echo "$Var"
> > >>>> o problema é que o resultado digo o resultado repito o resultado
> > >>>>
> > >> aparece
> > >>
> > >>>> assim
> > >>>> $ tr ' ' '\n' <<< $Var | sort | uniq -c | sort -r
> > >>>>      4 o
> > >>>>      3 resultado
> > >>>>      1 repito
> > >>>>      1 que
> > >>>>      1 problema
> > >>>>      1 é
> > >>>>      1 digo
> > >>>>      1 assim
> > >>>>      1 aparece
> > >>>>
> > >>>> Porém existem outras soluções:
> > >>>> 1 - Usando Arrays Associativas, a partir do Bash 4.0
> > >>>> $ for palavra in $Var; do let palavras[$palavra]++; done
> > >>>> $ paste <(echo ${palavras[@]} | xargs -n1) <(echo ${!palavras[@]} |
> > >>>>
> > >> xargs
> > >>
> > >>>> -n1)
> > >>>> 1    digo
> > >>>> 1    que
> > >>>> 1    repito
> > >>>> 3    resultado
> > >>>> 1    assim
> > >>>> 1    é
> > >>>> 4    o
> > >>>> 1    aparece
> > >>>> 1    problema
> > >>>>
> > >>>> 2- Usando awk:
> > >>>> awk '{
> > >>>>     for (w = 1; w <= NF; w++) conta[$w] ++
> > >>>> }
> > >>>> END {
> > >>>>     for (w in conta) print conta[w], w | "sort -nr"
> > >>>> }' /arquivo/que/deseja/contar
> > >>>>
> > >>>> Abraços,
> > >>>> Julio
> > >>>> Cursos de Shell e Zenity em 2 fins de semana?
> > >>>> - Aracaju turma de Shell em 12/05 - address@hidden;
> > >>>> - DF turma de Shell em 12/06 - ligue (61)3223-3000;
> > >>>> - RJ turma de Shell em 14/06 - ligue (21)2210-6061;
> > >>>> - Floripa turma de Shell e Zenity 12/07 – address@hidden;
> > >>>> - Turmas fechadas em outras cidades ligue (21)8112-9988.
> > >>>>
> > >>>>
> > >>>> Em 10 de maio de 2010 14:24, Helton Moraes <address@hidden>
> > >>>> escreveu:
> > >>>>
> > >>>>
> > >>>>> Caros colegas
> > >>>>>
> > >>>>> Primeiramente, caso alguém conheça alguma técnica ou programa ou
> > >>>>>
> > >> script
> > >>
> > >>>>> pronto (link) para o que estou tentando fazer, aceito a sugestão!
> > >>>>>
> > >> Vamos
> > >>
> > >>>> lá:
> > >>>>
> > >>>>> Estou encarregado de dar uma melhorada no estilo de um texto
> > >>>>>
> > >>>> publicitário,
> > >>>>
> > >>>>> e
> > >>>>> como bom nerd pretendo usar o shell para isso, contando as palavras
> > >>>>> repetidas de um arquivo de texto. Para isso, tentei usar um
> oneliner
> > >>>>>
> > >>> com
> > >>>
> > >>>> a
> > >>>>
> > >>>>> seguinte sequência:
> > >>>>>
> > >>>>> cat (carrega o arquivo)
> > >>>>> tr (trocar espaços por novas linhas \n)
> > >>>>> uniq -ci (contar as linhas repetidas ignorando maiúscula/minúscula)
> > >>>>> sort -r (para que as palavras mais frequentes apareçam na parte
> baixa
> > >>>>>
> > >>> do
> > >>>
> > >>>>> terminal assim que eu der ENTER)
> > >>>>>
> > >>>>> ficou assim:
> > >>>>>
> > >>>>> cat /home/helton/Desktop/test.txt | tr " " "\n" | uniq -c | sort -r
> > >>>>>
> > >>>>> O PROBLEMA é que o resultado é como o seguinte:
> > >>>>>
> > >>>>> 1 o
> > >>>>> 1 problema
> > >>>>> 1 é
> > >>>>> 1 que
> > >>>>> 1 o
> > >>>>> 1 resultado
> > >>>>> 1 digo
> > >>>>> 1 o
> > >>>>> 1 resultado
> > >>>>> 1 repito
> > >>>>> 1 o
> > >>>>> 1 resultado
> > >>>>> 1 aparece
> > >>>>> 1 assim
> > >>>>>
> > >>>>> ou seja, mesmo que tenha palavras repetidas no arquivo ele aparece
> > >>>>>
> > >> uma
> > >>
> > >>>>> ocorrência por linha precedido do 1.
> > >>>>>
> > >>>>> Então, como bom pai (do script), pergunto: "onde foi que eu errei?"
> > >>>>>
> > >>>>> Obrigado
> > >>>>>
> > >>>>> Helton
> > >>>>>
> > >>>>> [As partes desta mensagem que não continham texto foram removidas]
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>> [As partes desta mensagem que não continham texto foram removidas]
> > >>>>
> > >>>>
> > >>>>
> > >>>> ------------------------------------
> > >>>>
> > >>>>
> ---------------------------------------------------------------------
> > >>>> Esta lista não admite a abordagem de outras liguagens de
> programação,
> > >>>>
> > >>> como
> > >>>
> > >>>> perl, C etc. Quem insistir em não seguir esta regra será moderado
> sem
> > >>>>
> > >>> prévio
> > >>>
> > >>>> aviso.
> > >>>>
> ---------------------------------------------------------------------
> > >>>> Sair da lista: address@hidden
> > >>>>
> ---------------------------------------------------------------------
> > >>>> Esta lista é moderada de acordo com o previsto em
> > >>>> http://www.listas-discussao.cjb.net
> > >>>>
> ---------------------------------------------------------------------
> > >>>> Servidor Newsgroup da lista: news.gmane.org
> > >>>> Grupo: gmane.org.user-groups.programming.shell.brazil
> > >>>>
> > >>>> Links do Yahoo! Grupos
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>> [As partes desta mensagem que não continham texto foram removidas]
> > >>>
> > >>>
> > >>>
> > >>> ------------------------------------
> > >>>
> > >>> ---------------------------------------------------------------------
> > >>> Esta lista não admite a abordagem de outras liguagens de programação,
> > >>>
> > >> como
> > >>
> > >>> perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> > >>>
> > >> prévio
> > >>
> > >>> aviso.
> > >>> ---------------------------------------------------------------------
> > >>> Sair da lista: address@hidden
> > >>> ---------------------------------------------------------------------
> > >>> Esta lista é moderada de acordo com o previsto em
> > >>> http://www.listas-discussao.cjb.net
> > >>> ---------------------------------------------------------------------
> > >>> Servidor Newsgroup da lista: news.gmane.org
> > >>> Grupo: gmane.org.user-groups.programming.shell.brazil
> > >>>
> > >>> Links do Yahoo! Grupos
> > >>>
> > >>>
> > >>>
> > >>>
> > >> [As partes desta mensagem que não continham texto foram removidas]
> > >>
> > >>
> > >>
> > >> ------------------------------------
> > >>
> > >> ---------------------------------------------------------------------
> > >> Esta lista não admite a abordagem de outras liguagens de programação,
> > como
> > >> perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> > prévio
> > >> aviso.
> > >> ---------------------------------------------------------------------
> > >> Sair da lista: address@hidden
> > >> ---------------------------------------------------------------------
> > >> Esta lista é moderada de acordo com o previsto em
> > >> http://www.listas-discussao.cjb.net
> > >> ---------------------------------------------------------------------
> > >> Servidor Newsgroup da lista: news.gmane.org
> > >> Grupo: gmane.org.user-groups.programming.shell.brazil
> > >>
> > >> Links do Yahoo! Grupos
> > >>
> > >>
> > >>
> > >>
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> > > ------------------------------------
> > >
> > > ---------------------------------------------------------------------
> > > Esta lista não admite a abordagem de outras liguagens de programação,
> > como perl, C etc. Quem insistir em não seguir esta regra será moderado
> sem
> > prévio aviso.
> > > ---------------------------------------------------------------------
> > > Sair da lista: address@hidden
> > > ---------------------------------------------------------------------
> > > Esta lista é moderada de acordo com o previsto em
> > http://www.listas-discussao.cjb.net
> > > ---------------------------------------------------------------------
> > > Servidor Newsgroup da lista: news.gmane.org
> > > Grupo: gmane.org.user-groups.programming.shell.brazil
> > >
> > > Links do Yahoo! Grupos
> > >
> > >
> > >
> > >
> >
> >
> >
> >
> > ------------------------------------
> >
> > ---------------------------------------------------------------------
> > Esta lista não admite a abordagem de outras liguagens de programação,
> como
> > perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> prévio
> > aviso.
> > ---------------------------------------------------------------------
> > Sair da lista: address@hidden
> > ---------------------------------------------------------------------
> > Esta lista é moderada de acordo com o previsto em
> > http://www.listas-discussao.cjb.net
> > ---------------------------------------------------------------------
> > Servidor Newsgroup da lista: news.gmane.org
> > Grupo: gmane.org.user-groups.programming.shell.brazil
> >
> > Links do Yahoo! Grupos
> >
> >
> >
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio
> aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> ---------------------------------------------------------------------
> Servidor Newsgroup da lista: news.gmane.org
> Grupo: gmane.org.user-groups.programming.shell.brazil
>
> Links do Yahoo! Grupos
>
>
>
<http://www.google.com/search?q=me>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]