Re: Algué m me explica...
"Fernando M. Roxo da Motta" <[email protected]>
| Newsgroups | gmane.org.user-groups.linux.parana |
|---|---|
| Message-ID | <[email protected]> |
On Thu, Oct 27, 2005 at 05:10:27PM -0200, Matias Schweizer wrote:
> At 11:44 27/10/2005, you wrote:
> > E nem recebi mensagem sobre o assunto. De qualquer forma o melhor é o
> >papo ficar na lista, para que outros possam aproveitar e ajudar. ;)
> >>
> >> export IFS=`echo -e '\n'`
> ># Salva o IFS para poder recuperar, se necessário
> >IFSOLD="$IFS"
> ># Estabelece o novo IFS
> >IFS="\n"
>
> Aqui não funcionou. Ele até aceita o \n como newline, (exemplo echo
> $IFS), mas acha que o separador é o caracter "n" no texto. Bom, procurei
Muito esquisito.... Você usou aspas (") como está no exemplo ou
apóstrofos (') ? Afinal '\n' é *muito* diferente de "\n" sob a ótica de
uma SHELL.
> no news e achei como fazê-lo, embora não seja o mais recomendado.
>
> IFS='
> '
Trocou "sovaco" por "axila". ;)) Dá no mesmo, embora não fique tão
claro o que está sendo feito.
>
> Agora outra pergunta: Fazendo do jeito acima, resolve, mas ficou muito
> lento. Teria algum jeito mais eficiente de contar um bloco de linhas
> (sabendo que são variaveis e separados por "^$", tipo:
>
> as
> as
> as
> as
>
>
> as
> as
> a
> s
>
> sd
> sd
>
> ds
> d
>
> Blocos: 4 linhas; 4 linhas; 2 linhas; 2 linhas
>
> ???
>
*Talvez* a ferramenta que você está usando não seja a mais adequada.
Talvez outra linguagem (p.ex. Perl ou Python) seja mais conveniente. ou
talvez seja só o caso de você usar as ferramentas que já estão prontas e
disponÃveis no Linux/Unix, razão pela qual existe o mote "small is
beautiful" (o simples/pequeno é bonito/elegante).
O que você quer contar no fim das contas ? O número de blocos ? Ou o
número de blocos para cada quantidade de linhas ( quantos de 1 linha,
quantos de 2 linhas, ...)?
Você tem apenas uma linha em branco entre os blocos ? Ou este número
pode ser variável ?
Hmmm.... Vamos ver se consigo algo como você quer.....
Eu tenho um arquivo 'blah.txt'. Este arquivo tem as seguintes
caractarÃsticas :
$ wc -l blah.txt
127 blah.txt
grep '[^ ]' blah.txt|wc -l
75
$ grep -v '[^ ]' blah.txt|wc -l
52
Portanto são 127 linhas, sendo 75 com caracteres não brancos e 52 sem
caracteres não brancos, ou do tipo '^$', ou apenas com caracteres em
branco. Na verdade são :
$ grep '^$' blah.txt|wc -l
45
Apenas 45 classificáveis em '^$'.
A gente pode começar fazendo com que todas as linhas com caracteres em
brancos tenham apenas um caráter, por exemplo 'x' :
$ sed 's/ *[^ ].*/x/' blah.txt
x
x
x
x
x
x
..... cortando para diminuir a mensagem ....
x
x
x
Ok, agora vamos eliminar todas as linhas multiplicadas mas vamos guarar
a contagem :
$ sed 's/ *[^ ].*/x/' blah.txt | uniq -c
1
4 x
1
10 x
1
1 x
1
1
2 x
..... cortando para diminuir a mensagem ....
1 x
1
3 x
Parece que estamos num bom caminho. Agora vamos eliminar todas as
linhas em branco, ou seja, as que têm apenas um número, possivelmente,
seguido de um ou mais espaços :
$ sed 's/ *[^ ].*/x/' blah.txt | uniq -c|grep -v '[0-9] *$'
4 x
10 x
1 x
..... cortando para diminuir a mensagem ....
3 x
1 x
3 x
Agora o que temos a fazer é juntar estas contagens ordenando e contando
quantas de cada :
$ sed 's/ *[^ ].*/x/' blah.txt | uniq -c|grep -v '[0-9] *$'|sort -n | uniq -c
11 1 x
7 2 x
6 3 x
3 4 x
2 5 x
1 10 x
Resumo da história, o arquivo tem 11 blocos com uma linha isolada, 7
blocos com duas linhas, 6 com três linhas, 3 com quatro linhas, 2 com
cinco linhas e 1 bloco com dez linhas, perfazendo um total de :
11*1 + 7*2 + 6*3 + 3*4 + 2*5 + 1*10 = 75 linhas que não estão em branco,
como já sabÃamos desde o inÃcio.
à algo deste gênero que você queria ?
Roxo
--
---------------- Non luctari, ludare -------------------+ WYSIWYG Editor ?
Fernando M. Roxo da Motta <[email protected]> | VI !!
Except where explicitly stated I speak on my own behalf.| I see text,
( Usuário Linux registrado #39505 ) | I get text !