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: Mon, 10 May 2010 16:47:39 -0300

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]



reply via email to

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