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 !
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.