Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

1. Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

Thamiris Oliveira
Thamiris

(usa Outra)

Enviado em 02/10/2016 - 10:53h

Estou tentando criar um script capaz de ler vários arquivos e gerar outros arquivos.
Tenho esses arquivos de entrada:
file_babt="BABT20110601.txt" %estação, ano, mes, dia
file_bagb="BAGB20110601.txt"
file_bjrn="BJRN20110601.txt"
Cada arquivo desses acima possuem essas colunas com diversas linhas (estou exemplificando a 1º e ultima linha do arquivo file_babt):
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201105250000 12441600 1010.70 23.80 99.20 2.6526 2.3072 0.3454 286.89 56.4680
BABT 7 201105252355 12527700 1012.10 24.30 98.60 2.6702 2.3104 0.3598 287.18 58.8820

Gostaria de verificar quando a hora entre os arquivos forem semelhantes e gerar um txt para cada hora que agrupasse a mesma hora para todas as estações:
A hora (201105250000) se encontra na 3º coluna da posição 9 e 10

Até agora pensei em algo mais ou menos assim:
file_babt="BABT20110601.txt"
file_bagb="BAGB20110601.txt"
file_bjrn="BJRN20110601.txt"
while read linha awk '{ print $3 }'; do # A variável "linha" contém cada linha da terceira coluna
hora=$(echo "$linha" | cut -c 9-10) # Hora
min=$(echo "$linha" | cut -c 11-12 | rev) # min
if [ $hora == 00 ];then
$(echo "$linha") > gpsipw_201106010000.txt
elsif [ $hora == 01 ];then
$(echo "$linha") > gpsipw_201106010100.txt
elsif [ $hora == 02 ];then
$(echo "$linha") > gpsipw_201106010200.txt
elsif [ $hora == 23 ];then
$(echo "$linha") > gpsipw_201106012300.txt
fi
done

echo
echo "Fim...."
echo


  


2. Re: Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 02/10/2016 - 16:15h

Thamiris escreveu:

Estou tentando criar um script capaz de ler vários arquivos e gerar outros arquivos.
Tenho esses arquivos de entrada:
file_babt="BABT20110601.txt" %estação, ano, mes, dia
file_bagb="BAGB20110601.txt"
file_bjrn="BJRN20110601.txt"
Cada arquivo desses acima possuem essas colunas com diversas linhas (estou exemplificando a 1º e ultima linha do arquivo file_babt):
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201105250000 12441600 1010.70 23.80 99.20 2.6526 2.3072 0.3454 286.89 56.4680
BABT 7 201105252355 12527700 1012.10 24.30 98.60 2.6702 2.3104 0.3598 287.18 58.8820

Gostaria de verificar quando a hora entre os arquivos forem semelhantes e gerar um txt para cada hora que agrupasse a mesma hora para todas as estações:
A hora (201105250000) se encontra na 3º coluna da posição 9 e 10

Até agora pensei em algo mais ou menos assim:
file_babt="BABT20110601.txt"
file_bagb="BAGB20110601.txt"
file_bjrn="BJRN20110601.txt"
while read linha awk '{ print $3 }'; do # A variável "linha" contém cada linha da terceira coluna
hora=$(echo "$linha" | cut -c 9-10) # Hora
min=$(echo "$linha" | cut -c 11-12 | rev) # min
if [ $hora == 00 ];then
$(echo "$linha") > gpsipw_201106010000.txt
elsif [ $hora == 01 ];then
$(echo "$linha") > gpsipw_201106010100.txt
elsif [ $hora == 02 ];then
$(echo "$linha") > gpsipw_201106010200.txt
elsif [ $hora == 23 ];then
$(echo "$linha") > gpsipw_201106012300.txt
fi
done

echo
echo "Fim...."
echo

----------------------------------------------------------
Boa tarde Thamiris.
Dúvidas:
No seu exemplo, observo que a VAR "min", não é considerada. É isso mesmo?
O "script" deve "BUSCAR", por exemplo, a HORA "00" dos três arquivos e "CASO" "CASE", enviar para o arquivo gpsipw_201106010000.txt, somente o 3º campo (yyyymmddhhmm )?

Qto ao seu exemplo:
while read LINE;do
HORA=$(awk -F" " '{print $3}' <<< $LINE | cut -c 9-10)
.
.
done<ARQUIVO

-----------------------------------------------------
Estou desenvolvendo, com base na seguinte lógica:
for HH in {00..23};do
Busca "$HH" nos arquivos . . .
.
.
.
done

No aguardo,
Marcelo Oliver


3. Esclarecendo dúvidas

Thamiris Oliveira
Thamiris

(usa Outra)

Enviado em 02/10/2016 - 16:49h

Oi Marcelo, obrigada pelo retorno!
1. Não considerei a VAR "min" por falta de conhecimento mesmo...
2. O "script" deve "pegar", por exemplo, a HORA "00" dos três arquivos e enviar para o arquivo gpsipw_201106010000.txt todos os campos. Gostaria de agrupar todas as colunas dos arquivos de entrada que fossem da mesma hora.
Ex do arquivo de saída (agrupa todas as estações com a mesma hora):
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201105240000 12355200 1010.50 25.40 96.30 2.6321 2.3067 0.3254 287.78 53.3537
BABT 7 201105240005 12355500 1010.60 25.40 95.90 2.6321 2.3070 0.3251 287.78 53.3164
BSPC 5 201105240000 12355200 1008.50 26.60 88.90 2.6370 2.3022 0.3348 288.43 55.0272
BSPC 5 201105240005 12355500 1008.50 26.70 90.00 2.6370 2.3022 0.3348 288.48 55.0377
Muito obrigada!


4. Re: Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 02/10/2016 - 18:39h

Thamiris escreveu:

Oi Marcelo, obrigada pelo retorno!
1. Não considerei a VAR "min" por falta de conhecimento mesmo...
2. O "script" deve "pegar", por exemplo, a HORA "00" dos três arquivos e enviar para o arquivo gpsipw_201106010000.txt todos os campos. Gostaria de agrupar todas as colunas dos arquivos de entrada que fossem da mesma hora.
Ex do arquivo de saída (agrupa todas as estações com a mesma hora):
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201105240000 12355200 1010.50 25.40 96.30 2.6321 2.3067 0.3254 287.78 53.3537
BABT 7 201105240005 12355500 1010.60 25.40 95.90 2.6321 2.3070 0.3251 287.78 53.3164
BSPC 5 201105240000 12355200 1008.50 26.60 88.90 2.6370 2.3022 0.3348 288.43 55.0272
BSPC 5 201105240005 12355500 1008.50 26.70 90.00 2.6370 2.3022 0.3348 288.48 55.0377
Muito obrigada!


Boa noite Thamiris.
Considerei Hora e Minutos.
Verifique se atente a sua necessidade.


#!/bin/bash
file_A="BABT20110601.txt"
file_B="BAGB20110601.txt"
file_C="BJRN20110601.txt"
for HHMM in {00..23}{00..59};do
for ARQ in $file_A $file_B $file_C;do
LINE=$(awk -F" " '$3~/[0-9]{8}'$HHMM'/ {print $0}' "$ARQ")
[ "$LINE" ] && echo "$LINE" >> gpsipw_"$HHMM".txt
done
done



Aguardo retorno.
OBS.: Se a Resposta foi satisfatória, marque o tópico como resolvido e a mesma como "a melhor"...
Att.:
Marcelo Oliver



5. Não gerou os arquivos de saída

Thamiris Oliveira
Thamiris

(usa Outra)

Enviado em 03/10/2016 - 10:06h

Oi Marcelo, o programa que você desenvolveu não deu certo aqui. Ele não gerou os arquivos de saída.
Além disso, gostaria que no final os minutos não variassem nos nomes dos arquivos de saída. Eles precisam ter os nomes:
gpsipw_201106010000.txt [HH=00]
gpsipw_201106010100.txt [HH=01]
gpsipw_201106010200.txt [HH=02]
...
gpsipw_201106010300.txt
Embora os minutos não variem nos nomes do arquivos, eles estão inseridos dentro dos arquivos. Desta forma cada arquivo de saída terá então todas as colunas dos arquivos de entrada das diferentes estações agrupando as linhas referentes a mesma hora.
Ex. do arquivo de saída:
nome do arquivo: gpsipw_201106010000.txt
Matriz do arquivo acima:
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201106010000 12355200 1010.50 25.40 96.30 2.6321 2.3067 0.3254 287.78 53.3537
BABT 7 201106010005 12355500 1010.60 25.40 95.90 2.6321 2.3070 0.3251 287.78 53.3164
BAGB 5 201106010000 12355200 1008.50 26.60 88.90 2.6370 2.3022 0.3348 288.43 55.0272
BAGB 5 201106010005 12355500 1008.50 26.70 90.00 2.6370 2.3022 0.3348 288.48 55.0377

Não entendi o que vc definiu para esta linha: LINE=$(awk -F" " '$3~/[0-9]{8}'$HHMM'/ {print $0}' "$ARQ")

Muito obrigada!
Thamiris


6. Re: Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/10/2016 - 11:39h

Thamiris escreveu:

Oi Marcelo, o programa que você desenvolveu não deu certo aqui. Ele não gerou os arquivos de saída.
Além disso, gostaria que no final os minutos não variassem nos nomes dos arquivos de saída. Eles precisam ter os nomes:
gpsipw_201106010000.txt [HH=00]
gpsipw_201106010100.txt [HH=01]
gpsipw_201106010200.txt [HH=02]
...
gpsipw_201106010300.txt
Embora os minutos não variem nos nomes do arquivos, eles estão inseridos dentro dos arquivos. Desta forma cada arquivo de saída terá então todas as colunas dos arquivos de entrada das diferentes estações agrupando as linhas referentes a mesma hora.
Ex. do arquivo de saída:
nome do arquivo: gpsipw_201106010000.txt
Matriz do arquivo acima:
Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV
BABT 7 201106010000 12355200 1010.50 25.40 96.30 2.6321 2.3067 0.3254 287.78 53.3537
BABT 7 201106010005 12355500 1010.60 25.40 95.90 2.6321 2.3070 0.3251 287.78 53.3164
BAGB 5 201106010000 12355200 1008.50 26.60 88.90 2.6370 2.3022 0.3348 288.43 55.0272
BAGB 5 201106010005 12355500 1008.50 26.70 90.00 2.6370 2.3022 0.3348 288.48 55.0377

Não entendi o que vc definiu para esta linha: LINE=$(awk -F" " '$3~/[0-9]{8}'$HHMM'/ {print $0}' "$ARQ")

Muito obrigada!
Thamiris


Bom dia Thamiris.
É até mais rápida a execução se não forem considerados os minutos,
veja que em "for HHMM in {00..23}{00..59};do . . . " temos 1440 combinações.
Quanto ao comando:
LINE=$(awk -F" " '$3~/[0-9]{8}'$HHMM'/ {print $0}' "$ARQ")
"VARRE" o arquivo, procurando por linhas, cujo "CAMPO 03", "case" com a REGEX "[0-9]{8}'$HHMM",
que significa:
[0-9]{8} => 08 caracteres numéricos
$HHMM => HoraMinuto, de acordo com o laço "for HHMM in {00..23}{00..59};do"
Que combina todas as HORAS e MINUTOS (00:00 a 23:59). # Será alterado

Confirme, por favor.
Visto que, tais arquivos referem-se ao rastreio diário de "receptores GPS",
O campo "yyyymmdd" será sempre igual nos três arquivos, certo?
Isso torna o processo mais rápido, montarei a REGEX com a informação "yyyymmdd", que deverá ser informada.

Estou refazendo, e logo mais posto para que você faça os testes.

att
marcelo oliver



7. Confirmação

Thamiris Oliveira
Thamiris

(usa Outra)

Enviado em 03/10/2016 - 13:01h

Confirmo que o campo "yyyymmdd" será sempre igual nos três arquivos. Agradeço os esclarecimentos =)


8. Re: Criando arquivo de saida a partir de varios arquivos de entrada com o mesmo horário

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/10/2016 - 14:31h

Thamiris escreveu:

Confirmo que o campo "yyyymmdd" será sempre igual nos três arquivos. Agradeço os esclarecimentos =)

-----------------------------------------------------------------------------------------------------------------------------------------------
Olá Thamiris.
Testado e funcionando . . .
Segue:
#!/bin/bash
file_A="BABT20110601.txt"
file_B="BAGB20110601.txt"
file_C="BJRN20110601.txt"
TITULOS="Esta ESmet yyyymmddhhmm segJul Pres Temp UR DTROP DZH DZW TM IWV"
[ -d SAIDA ] || mkdir SAIDA
DATA=$(awk -F" " 'NR==2 {print $3}' "$file_A"|cut -c 1-8)

for HH in {00..23};do
LINE=$(awk -F" " '$3~/\<'$DATA$HH'..\>/ {print $0}' $file_A $file_B $file_C)
[ "$LINE" ] && echo -e "$TITULOS\n$LINE" > SAIDA/gpsipw_"$DATA$HH"00.txt
done

OBS.:
01 - Os RESULTADOS, são colocados na PASTA "SAIDA", o SCRIPT cria a pasta.
02 - "PEGA" a DATA no ARQUIVO "$file_A"
03 - EXECUTE o SCRIPT no DIRETóRIO que contem os ARQUIVOS "$file_A", "$file_B" e "$file_C"
-------------------------------------------------------------------------------------------------------------------------
04 - Melhor "pecar por excesso do que por omissão" . . . Então segue:
Copie e cole o Script acima no editor de TEXTOS, salve e de o NOME de sua preferencia, depois de permissão de execução, com o comando:
chmod +x NOME_ESCOLHIDO
Execute-o, da seguinte forma:
./NOME_ESCOLHIDO
-------------------------------------------------------------------------------------------------------------------------
Como funciona . . .
A lógica é simples:
O COMANDO :
awk -F" " '$3~/\<'$DATA$HH'..\>/ {print $0}' $file_A $file_B $file_C
Busca nos três arquivos, onde o 3º CAMPO, satisfaça a EXPRESSãO REGULAR composta por "DATAHORA.." (.. significa dois caracteres)
Para Evitar que sejam criados arquivos VAZIOS, atribuo a saída do "COMANDO"
Para a VAR LINE, e testo a mesma com [ "$LINE" ]
Que verifica se $LINE não é VAZIA, e gera o arquivo de saída.
Não sei se a explicação ficou clara . . . :)
Gostaria de testar com os "ARQUIVOS REAIS", se possível, envie os por "MENSAGEM" . . .
É só clicar no meu nome, é aberto o "perfil", e depois clicar em "MENSAGEM".


Att.:
Marcelo Oliver








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts