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

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

Re: while em arquivo texto


From: pinguimrmbr
Subject: Re: while em arquivo texto
Date: Mon, 01 Nov 2004 22:32:41 -0000
User-agent: eGroups-EW/0.82

> Oi gente,
> sou novo por aqui, estou comecando com shell-script, sera que alguem
> poderia me ajudar?
> 
> Tenho a seguinte situação:
> 
> Diretorio ABC,teste,1000
>    item1,jonas,500
>    item2,junior,9
> Diretorio DEF,teste2,5000
>    item10,marcia,23
>    item52,brenda,35
>    item1,jeffe,12
> Diretorio ZXVF,novo,1525 ....e assim por diante
> 
> Queria fazer um script que pegasse a primeira linha (onde o caracter
> encontra-se na posicao 1 sempre) e atribuisse as linhas abaixo a ele
> ate encontrar novamente algo na posicao 1 e soma-se isto, depois
> novamente e assim ate terminar o arquivo.
> 
> PS. As colunas sao separadas por ","

Ola, William

Tambem cheguei hoje por aqui, embora nao seja tao novo :)

Vamos la: voce soluciona o seu problema com duas linhas muito 
simples. Imaginando-se que o arquivo chame-se cadastro.txt, voce 
poder fazer:

egrep "^(\w)" cadastro.txt 
para selecionar as linhas que iniciam-se com algum caracter "valido" 
para a sua estrutura de dados, e
egrep "(^(\W)"
para selecionar as linhas que iniciam-se com caracteres "invalidos", 
como o espaco, por exemplo.

Até ai, temos a maneira que vamos ler as linhas. Agora, precisamos 
criar uma estrutura de controle para ler o arquivo. Comecando nosso 
script

#!/bin/bash

for LINHA in `cat cadastro.txt` ; do
        if [ `echo $LINHA | egrep -c "^(\w)"` -eq "1" ]; then 
                # achou um caracter
                echo "Achei um registro Primario"
                echo $LINHA
        else 
                # nao achou um caracter
                echo "Achei um registro secundario"
                echo $LINHA
        fi
done

Opa ! Ja estamos separando os registros "Primarios"  
dos "Secundarios"  ou "Filhos" do "Primario". 

Para separar os campos de cada registro ( como vc mesmo disse, 
separados por , ) usamos uma estrutura assim:

CAMPO1=`echo $LINHA | cut -d "," -f 1`
CAMPO2=`echo $LINHA | cut -d "," -f 2`
CAMPO3=`echo $LINHA | cut -d "," -f 3`

O final do seu e-mail esta meio confuso. Qual o resultado final que 
vc espera ? Seria algo como:

Diretorio ABC,teste,1000:item1,jonas,500;item2,junior,9 ?

Veja que uma estrutura de dados rígida é mais simples de se 
trabalhar, entao peguei seus 3 registros ( o principal e seus 
filhos ) e formatei separando os filhos do principal por : e os 
filhos por ;

Acho que por ai vc ja tem como começar. Daqui pra frente, é só 
escrever codigo para gerar o resultado que vc quer. Além de shell 
scripts, voce pode tentar resolver o problema com um script perl, que 
ficaria menor e, por exemplo, evitaria construcoes como as do cut, 
visto que vc pode fazer:

@campos = split(\,/, $linha );

e ter $campos[1], $campos[2] e assim por diante.

Va postando a evolucao do seu trabalho aqui

Um abraco

MrBiTs












reply via email to

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