apenas uma revisão (por favor) [RESOLVIDO]

1. apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 05/12/2011 - 19:19h

estou usando um modo de montar script q já uso a algum tempo , porem eu não consigo entender pq não funciona

então peço encarecidamente q algum colega possa me dar uma luz sobre o q estou fazendo de errado.

o código que estou usando é:

----------------------------------------
#!/bin/bash

estacao=Alta_Floresta

F1()
{
while read linha
do

ano=`echo $linha | awk '{print $1}'`
mes=`echo $linha | awk '{print $2}'`
range=`echo $linha | awk '{print $5}'`
temp=`echo $linha | awk '{print $6}'`

echo $estacao $ano $mes $range $temp

done < "$lista"
}

cd /home/Lincoln/TESTE/Dados/

cat Alta_Floresta_00Z_300-100hpa.txt > vol.lista.temp

while read lista
do
F1
done < vol.lista.temp
----------------------------------------


na verdade o script era maior porem eu fui cortando ele até um ponto bastante inicial e foi onde vi que ele não funciona quando entra na subrotina F1()
o estranho é q eu uso um semelhante a esse com a mesma extrutura.

Na parte de declarar as variaveis eu tbm fiz assim:
ano=$(echo $linha | cut -d" " -f1)
e não funcionou.

tentei dar um echo no $linha e nada tbm



  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/12/2011 - 07:57h


#!/bin/bash

estacao=Alta_Floresta

F1()
{
while read linha
do

ano=`echo $linha | awk '{print $1}'`
mes=`echo $linha | awk '{print $2}'`
range=`echo $linha | awk '{print $5}'`
temp=`echo $linha | awk '{print $6}'`

echo ---- Testando ----
echo Estação: $estacao
echo Ano: $ano
echo Mês: $mes
echo Range: $range
echo Temp: $temp
echo ------------------

done < "Alta_Floresta_00Z_300-100hpa.txt"
}
F1


Assim funciona. Separei os valores apenas para testar se tudo estava funcionando, mas se quiser pode colocar em uma única linha.

3. Re: apenas uma revisão (por favor) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/12/2011 - 19:34h

Não entendi muito bem seu script, o que exatamente quer fazer? Qual o conteúdo dos arquivos?

E isso aqui está um pouco confuso:

ano=`echo $linha | awk '{print $1}'` $(echo $linha | cut -d" " -f1)

Não faz sentido, veja bem:

$ echo abc def ghi|awk '{print $1}'
abc

E agora:

$ echo abc def ghi|cut -d" " -f1
abc


E outra coisa, não se mistura ` ` e $() desta forma, você pode fazer simplesmente:

ano=`comando $variavel | comando | comando | ...`

Agora, o que você está querendo com esse awk e cut eu não entendi




4. Re: apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 05/12/2011 - 19:53h

Antes de mais nada, mrk3004 obrigado por tentar ajudar.

eu estou usando awk ou o cut para "pegar" o um valor especifico na linha e guarda-lo em uma variavel.

sei que não se mistura ` ` com $(), como estava dando erro começei a fazer testes (desespero eu sei)

mas apareceu duplicado na linha pq quando eu copiei para fazer o post colei errado ... desculpe, vou editar o post e retirar esse erro de postagem.

eu modifiquei o script e coloquei um while dentro de outro para evitar a sub rotina
----------------------------
#!/bin/bash

estacao=Alta_Floresta

cd /home/Lincoln/TESTE/Dados/

cat Alta_Floresta_00Z_300-100hpa.txt > vol.lista.temp

while read lista
do
while read linha
do

ano1=$(echo $linha | cut -d" " -f1)
ano2=`echo $linha | awk '{print $1}'`

echo $estacao
echo $ano1
echo $ano2

done < "$lista"
done < vol.lista.temp
----------------------------

e continua dando erro, quando uso bash -x aparece "no such file or directory


5. Re: apenas uma revisão (por favor) [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 05/12/2011 - 22:15h

Explica o que vc quer fazer, coloca um exemplo do conteúdo dos arquivos, fica melhor pra ajudar.

Uma coisa que achei estranho...

O conteúdo desse arquivo abaixo:
Alta_Floresta_00Z_300-100hpa.txt

São nomes de arquivos ??

Se não, não há a necessidade de fazer esse duplo


while read lista
do
while read linha
do
..
done < "$lista"
done < "$arquivo"

..




6. Re: apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 06/12/2011 - 07:39h

O conteúdo do arquivo Alta_Floresta_00Z_300-100hpa.txt é

-----------------------------
1992 09 26 00Z 300-100 -59.40
1994 06 28 00Z 300-100 -50.95
1994 06 29 00Z 300-100 -54.88
1994 06 30 00Z 300-100 -55.26
1994 07 01 00Z 300-100 -49.35
1994 08 04 00Z 300-100 -54.82
1994 08 05 00Z 300-100 -57.75
1994 08 06 00Z 300-100 -55.91
1994 08 07 00Z 300-100 -54.80
1994 08 08 00Z 300-100 -55.51
-----------------------------

porem no arquivo verdadeiro são mais de 700 linhas

eu tentei chamar o arquivo diretamente para o read do while mas não funcionou, então dei um "cat Alta_Floresta_00Z_300-100hpa.txt > vol.lista.temp" que ai o while reconhece o arquivo para iniciar o read

já li o código um bocado de vezes e não consigo ver o que está errado

o meu objetivo com esse código será fazer umas medias usando o bc, mas para isso, primeiro preciso que o script consiga ler linha por linha e guardar em variáveis os valores que eu quero. é por isso que em um primeiro passo eu estou apenas exibindo com o echo todos o conteúdo do arquivo


7. Re: apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 06/12/2011 - 08:38h

Maravilha amigo ... agora funcionou

embora esteja bastante parecido com o q eu fiz ... mas é esse parecido que me mata

valeu


8. Re: apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 06/12/2011 - 09:35h

desculpa incomodar novamente

mas é que da forma como ficou ele está em loop infinito. como faço para ele parar quando chegar ao fim do arquivo(Alta_Floresta_00Z_300-100hpa.txt) ?

da outra vez em que usei o comando read ele terminava quando lia a ultima linha, e neste caso ele está voltando para a primeira linha ... pensei que poderia ser alguma parte das minhas medias mão não foi

executei ele dessa forma:


F1()
{
while read linha
do

ano=`echo $linha | awk '{print $1}'`
mes=`echo $linha | awk '{print $2}'`
range=`echo $linha | awk '{print $5}'`
temp=`echo $linha | awk '{print $6}'`

echo $estacao $ano $mes $range $temp

done < "Alta_Floresta_00Z_300-100hpa.txt"
}


como faço para resolver isso ?

PS: como faço para colocar o código do script dentro de uma especie de quote aqui no fórum ? ... assim como vc fez, fica muito melhor apresentável


9. Re: apenas uma revisão (por favor) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/12/2011 - 09:49h

Sobre a formatação, é só usar [ code] digitar o código aqui [ /code] (sem espaços nas tags code)

E sobre o código, ele para após chegar ao final do arquivo...

Vamos entender o código?


function F1() {
while read linha # Enquanto ler linha
do # Executa
funções # Funções
done < "arquivo" # Fim
}

# Você passa o arquivo para o laço while que vai ler
# as linhas enquanto existir. Se não existir mais linhas
# O laço para e executa o que está abaixo da chamada da função.

F1 # Chamada
# Abaixo da chamada



10. Re: apenas uma revisão (por favor) [RESOLVIDO]

Lincoln Oliveira de Souza
lincolnsol

(usa Fedora)

Enviado em 06/12/2011 - 10:01h

obrigado pela ajuda mrk3004

mas é exatamente esse p problema ... eu entendo o q o laço while faz e como ele se comporta usando o read, já utilizei esse artificio antes, porem tá phooda, primeiro ele não reconhecia os valores dentro do laço e agora não para.

se eu executar ele exatamente como eu cite acima a resposta do console é:


1992 09 26 00Z 300-100 -59.40
1994 06 28 00Z 300-100 -50.95
1994 06 29 00Z 300-100 -54.88
1994 06 30 00Z 300-100 -55.26
1994 07 01 00Z 300-100 -49.35
1994 08 04 00Z 300-100 -54.82
1994 08 05 00Z 300-100 -57.75
1994 08 06 00Z 300-100 -55.91
1994 08 07 00Z 300-100 -54.80
1994 08 08 00Z 300-100 -55.51
1994 08 09 00Z 300-100 -50.36
1994 08 10 00Z 300-100 -48.40
1994 08 11 00Z 300-100 -66.80
1994 08 12 00Z 300-100 -57.62
1994 08 13 00Z 300-100 -58.00
1994 08 14 00Z 300-100 -53.54
1994 08 15 00Z 300-100 -51.10
1994 08 16 00Z 300-100 -55.38
1994 08 17 00Z 300-100 -60.40
1994 08 18 00Z 300-100 -54.86
1994 08 19 00Z 300-100 -54.90
1994 08 20 00Z 300-100 -57.90
1994 08 21 00Z 300-100 -50.80
1994 08 24 00Z 300-100 -55.76
1994 08 25 00Z 300-100 -53.12
1994 08 26 00Z 300-100 -56.66
1994 08 27 00Z 300-100 -55.86
1994 08 28 00Z 300-100 -51.05
1994 08 30 00Z 300-100 -60.08
1994 08 31 00Z 300-100 -46.43
1992 09 26 00Z 300-100 -59.40
1994 06 28 00Z 300-100 -50.95
1994 06 29 00Z 300-100 -54.88
1994 06 30 00Z 300-100 -55.26
1994 07 01 00Z 300-100 -49.35
1994 08 04 00Z 300-100 -54.82
1994 08 05 00Z 300-100 -57.75
1994 08 06 00Z 300-100 -55.91


ele para ai pq eu dei um Ctrl+C, pq deixei pra ver até aonde ia e eu contei uns 4 loops antes de eu cansar e para ele.

se na sua maquina o codigo funciona e na mimha tá em loop, existe alguma configuração que eu devá conferir ?


11. Re: apenas uma revisão (por favor) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/12/2011 - 10:07h

Aqui funciona perfeitamente e para ao chegar ao final do arquivo. Não há nenhuma configuração a fazer, deve ter alguma coisa errada no seu código.

Você disse que o seu arquivo tem +-700 linhas, então o laço vai parar após ler as 700 linhas. Se quiser parar antes disso pode usar o comando break com alguma verificação, mas se quiser parar ao final do arquivo, o bash já faz isso sozinho.


12. Re: apenas uma revisão (por favor) [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 06/12/2011 - 10:34h

Olhando o que vc postou não tem mesmo repetição de valores, vc esperou chegar nas 700 linhas?

se quiser ver detalhes do que tá acontecendo, basta chamar o script assim:

bash -x ./nome_do_script.sh


ai vai poder analisar o que acontece, mas no caso, me parece que vc não esperou as 700 linhas.

Se quiser parar antes use a dica acima.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts