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: Lawrence Waclawiak
Subject: Re: [shell-script] Erro num script pra contar frequência das palavras
Date: Mon, 10 May 2010 19:17:23 -0300
User-agent: Thunderbird 2.0.0.23 (X11/20090817)

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







reply via email to

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