Organizar dados [RESOLVIDO]

1. Organizar dados [RESOLVIDO]

Carolina Queiroz
carolinaq

(usa Ubuntu)

Enviado em 16/04/2020 - 01:03h

Eu tenho dois arquivos .txt e gostaria de juntar os dois e colocar em um só. Os meus dados são assim:
arquivo1.txt
1 1 1998 32.5
2 1 1998 37.2
3 1 1998 40.4
5 1 1998 30.8

arquivo 2.txt
1 1 1998 28.2
2 1 1998 35.2
4 1 1998 39.6
6 1 1998 33.0

Então, preciso de uma saída como esta:

1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 -
4 1 1998 - 39.6
5 1 1998 30.8
6 1 1998 - 33.0

ou

1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4
4 1 1998 39.6
5 1 1998 30.8
6 1 1998 33.0

ou

1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.

Alguém poderia me ajudar?




  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/04/2020 - 23:59h

carolinaq escreveu:

msoliver escreveu:


carolinaq escreveu:

msoliver escreveu:

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Sim! Vou eliminar as linhas que tem NaN

Boa tarde Carolina, segue, com BASE nos dados POSTADOS INICIALMENTE.
cat mescla.awk

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1]) )
printf "%s %s %d %s %s\n" ,cp1[$1],cp2[$1],cp3[$1],cp4[$1],$4
}

Modo de uso:
awk -f mescla.awk arq1.txt arq2.txt
Saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2

Observe o nome dos arquivos!
Se a resposta foi satisfatória, MARQUE o tópico como resolvido e escolha a melhor RESPOSTA.... :)
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Marcelo, meu arquivo1.txt tem 719 linhas e o arquivo2.txt tem 720 linhas. Quando faço o mescla.awk só me retorna 30 linhas, quando deveria retornar 719 linhas. Você poderia me ajudar a identificar o erro?

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;cp5[$1]=$5;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1] && $4==cp4[$1]))
printf "%s %s %s %d %s %s\n",cp1[$1],cp2[$1],cp3[$1],cp4[$1],cp5[$1],$5
}


Alterei algumas coisas pois meus dados estão assim agora:

0 15 6 2014 0.6
1 15 6 2014 0.4
2 15 6 2014 1.19
3 15 6 2014 0.2
4 15 6 2014 0.2
5 15 6 2014 0.4
6 15 6 2014 0.4
7 15 6 2014 0.2
8 15 6 2014 0.2
9 15 6 2014 NaN
10 15 6 2014 NaN
11 15 6 2014 NaN

Boa noite Carolina.
Segue uma solução mais prática do que a enviada por e-mail.
Testado e conferido...

1º passo,
#Inclui o campo com a Data/Hora, no formato "Unix time Stamp" em arquivo1.txt e arquivo2.txt
É gerado um backup do original.


awk -i inplace -v INPLACE_SUFFIX=.bak '{Uts=mktime($4" "$3" "$2" "$1" "00" "00);printf "%s %02d %02d %02d %s %s\n" ,Uts,$1,$2,$3,$4,$5}' arquivo1.txt arquivo2.txt

2º Passo salve o mescla
cat mescla.awk
BEGIN{FS=" ";printf "H D M Ano Vlr_1 Vlr_2\n";}
{
if(FILENAME == "arquivo1.txt"){data_01[$1]=$1;valor_01[$1]=$6;}
if(FILENAME == "arquivo2.txt")
if($1 == data_01[$1] && $6 != "NaN" && valor_01[$1] != "NaN")
printf "%s %s %s %s %s %s\n" ,$2,$3,$4,$5,$6,valor_01[$1]; #else print $2,$3,$4,$5,$6,valor_01[$1],"NÃO CASOU!!"
}

3 passo, execute:
awk -f mescla.awk arquivo1.txt arquivo2.txt|column -t
Resultado:
H D M Ano Vlr_1 Vlr_2 Status
14 06 06 2014 1.364228 0.39 Okay!
18 14 06 2014 0.247516 0.2 Okay!
20 14 06 2014 5.097166 6.5 Okay!
23 14 06 2014 1.676368 0.4 Okay!
00 15 06 2014 5.551308 0.6 Okay!
01 15 06 2014 1.951 0.4 Okay!
02 15 06 2014 0.532686 1.19 Okay!
03 15 06 2014 1.3404 0.2 Okay!
04 15 06 2014 8.60231 0.2 Okay!
05 15 06 2014 8.139638 0.4 Okay!
06 15 06 2014 1.22334 0.4 Okay!
07 15 06 2014 0.439229 0.2 Okay!
08 15 06 2014 0.386959 0.2 Okay!
12 15 06 2014 0.16528 0.2 Okay!
13 15 06 2014 1.969192 0.2 Okay!
08 23 06 2014 0.474899 0.2 Okay!
19 26 06 2014 0.025491 0.39 Okay!
02 27 06 2014 0.548529 3.74 Okay!
07 27 06 2014 0.496584 0.2 Okay!
17 29 06 2014 0.073492 1.18 Okay!


Obs.: Caso queira visualizar os registros que "não casaram", exclua o "#" antes do else, no "mescla.awk"

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________

3. Re: Organizar dados

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/04/2020 - 03:56h

Os arquivos estão preordenados, e ambos ordenados com o mesmo citério? Se estiverem, é melhor, porque isso lhe permitirá percorrer os dois simultaneamente.

As três primeiras colunas são, respectivamente, dia, mês e ano? Se forem, você pode ler a próxima linha de cada arquivo, converter a data de cada um dos arquivos para o formato YYYYmmdd e fazer a comparação numérica dessas duas datas. Se a data do arquivo 1 for menor que a data do arquivo 2, imprime uma linha contendo a data, os dados do arquivo 1, e marcando os dados do arquivo 2 como ausentes, e então lê a próxima linha somente do arquivo 1. Se a data do arquivo 2 for menor que a data do arquivo 1, imprime uma linha contendo a data, a indicação de ausência de dados do arquivo 1 e os dados do arquivo 2, e então lê a próxima linha somente do arquivo 2. Se as duas datas forem iguais, imprime a data, os dados do arquivo 1 e os dados do arquivo 2, e lê a próxima linha de ambos os arquivos, e repete esse mecanismo, a partir da conversão do formato das datas, enquanto houver dados em qualquer um dos arquivos.

Em pseudocódigo, seria mais ou menos o seguinte.

arquivos arq1, arq2

variáveis fim_arq1, dia1, mês1, ano1, valor1, data1
variáveis fim_arq2, dia2, mês2, ano2, valor2, data2

abre arq1 para leitura
fim_arq1 recebe falso
abre arq2 para leitura
fim_arq2 recebe falso
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 recebe verdadeiro
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
enquanto fim_arq1 = falso ou fim_arq2 = falso,
se fim_arq1 = falso, data1 recebe formatação("YYYYmmdd", dia1, mês1, ano1)
se fim_arq2 = falso, data2 recebe formatação("YYYYmmdd", dia2, mês2, ano2)
se (fim_arq1 = falso) e ((fim_arq2 = verdadeiro) ou (data1 < data2)),
imprime dia1, mes1, ano1, valor1, NaN
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 receber verdadeiro
senão, se (fim_arq2 = falso) e ((fim_arq2 = verdadeiro) ou (data1 > data2)),
imprime dia2, mês2, ano2, NaN, valor2
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
senão # isto é: data1=data2
imprime dia1, mês1, ano1, valor1, valor2
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 receber verdadeiro
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
fecha arq2
fecha arq1



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


4. Re: Organizar dados [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/04/2020 - 14:44h

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


5. Re: Organizar dados [RESOLVIDO]

Carolina Queiroz
carolinaq

(usa Ubuntu)

Enviado em 16/04/2020 - 14:51h

paulo1205 escreveu:

Os arquivos estão preordenados, e ambos ordenados com o mesmo citério? Se estiverem, é melhor, porque isso lhe permitirá percorrer os dois simultaneamente.

As três primeiras colunas são, respectivamente, dia, mês e ano? Se forem, você pode ler a próxima linha de cada arquivo, converter a data de cada um dos arquivos para o formato YYYYmmdd e fazer a comparação numérica dessas duas datas. Se a data do arquivo 1 for menor que a data do arquivo 2, imprime uma linha contendo a data, os dados do arquivo 1, e marcando os dados do arquivo 2 como ausentes, e então lê a próxima linha somente do arquivo 1. Se a data do arquivo 2 for menor que a data do arquivo 1, imprime uma linha contendo a data, a indicação de ausência de dados do arquivo 1 e os dados do arquivo 2, e então lê a próxima linha somente do arquivo 2. Se as duas datas forem iguais, imprime a data, os dados do arquivo 1 e os dados do arquivo 2, e lê a próxima linha de ambos os arquivos, e repete esse mecanismo, a partir da conversão do formato das datas, enquanto houver dados em qualquer um dos arquivos.

Em pseudocódigo, seria mais ou menos o seguinte.

arquivos arq1, arq2

variáveis fim_arq1, dia1, mês1, ano1, valor1, data1
variáveis fim_arq2, dia2, mês2, ano2, valor2, data2

abre arq1 para leitura
fim_arq1 recebe falso
abre arq2 para leitura
fim_arq2 recebe falso
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 recebe verdadeiro
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
enquanto fim_arq1 diferente de falso ou fim_arq2 diferente de falso,
se fim_arq1 = falso, data1 recebe formatação("YYYYmmdd", dia1, mês1, ano1)
se fim_arq2 = falso, data2 recebe formatação("YYYYmmdd", dia2, mês2, ano2)
se (fim_arq1 = falso) e ((fim_arq2 = verdadeiro) ou (data1 < data2)),
imprime dia1, mes1, ano1, valor1, NaN
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 receber verdadeiro
senão, se (fim_arq2 = falso) e ((fim_arq2 = verdadeiro) ou (data1 > data2)),
imprime dia2, mês2, ano2, NaN, valor2
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
senão # isto é: data1=data2
imprime dia1, mês1, ano1, valor1, valor2
lê (dia1, mês1, ano1, valor1) de arq1
se leitura falhou, fim_arq1 receber verdadeiro
lê (dia2, mês2, ano2, valor2) de arq2
se leitura falhou, fim_arq2 recebe verdadeiro
fecha arq2
fecha arq1



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


Então, eu acabei de converter para ano, mês, dia e valor. Então ficou: YYYY MMM DD VALOR



6. Re: Organizar dados [RESOLVIDO]

Carolina Queiroz
carolinaq

(usa Ubuntu)

Enviado em 16/04/2020 - 14:52h

msoliver escreveu:

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Sim! Vou eliminar as linhas que tem NaN


7. Re: Organizar dados

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/04/2020 - 15:31h

carolinaq escreveu:

Então, eu acabei de converter para ano, mês, dia e valor. Então ficou: YYYY MMM DD VALOR


Bom, o algoritmo pronto eu já mostrei acima. É só você o converter para a linguagem da sua preferência. Pode ser Shell, pode ser Python, pode ser C, pode ser Java...

NOTA: Em um lugar em que a comparação deveria ser "igual a", eu escrevei "diferente de". Já corrigi.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


8. Re: Organizar dados [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/04/2020 - 15:38h


carolinaq escreveu:

msoliver escreveu:

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Sim! Vou eliminar as linhas que tem NaN

Boa tarde Carolina, segue, com BASE nos dados POSTADOS INICIALMENTE.
cat mescla.awk

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1]) )
printf "%s %s %d %s %s\n" ,cp1[$1],cp2[$1],cp3[$1],cp4[$1],$4
}

Modo de uso:
awk -f mescla.awk arq1.txt arq2.txt
Saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2

Observe o nome dos arquivos!
Se a resposta foi satisfatória, MARQUE o tópico como resolvido e escolha a melhor RESPOSTA.... :)
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


9. Re: Organizar dados

Carolina Queiroz
carolinaq

(usa Ubuntu)

Enviado em 17/04/2020 - 01:30h

msoliver escreveu:


carolinaq escreveu:

msoliver escreveu:

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Sim! Vou eliminar as linhas que tem NaN

Boa tarde Carolina, segue, com BASE nos dados POSTADOS INICIALMENTE.
cat mescla.awk

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1]) )
printf "%s %s %d %s %s\n" ,cp1[$1],cp2[$1],cp3[$1],cp4[$1],$4
}

Modo de uso:
awk -f mescla.awk arq1.txt arq2.txt
Saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2

Observe o nome dos arquivos!
Se a resposta foi satisfatória, MARQUE o tópico como resolvido e escolha a melhor RESPOSTA.... :)
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Marcelo, meu arquivo1.txt tem 719 linhas e o arquivo2.txt tem 720 linhas. Quando faço o mescla.awk só me retorna 30 linhas, quando deveria retornar 719 linhas. Você poderia me ajudar a identificar o erro?

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;cp5[$1]=$5;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1] && $4==cp4[$1]))
printf "%s %s %s %d %s %s\n",cp1[$1],cp2[$1],cp3[$1],cp4[$1],cp5[$1],$5
}


Alterei algumas coisas pois meus dados estão assim agora:

0 15 6 2014 0.6
1 15 6 2014 0.4
2 15 6 2014 1.19
3 15 6 2014 0.2
4 15 6 2014 0.2
5 15 6 2014 0.4
6 15 6 2014 0.4
7 15 6 2014 0.2
8 15 6 2014 0.2
9 15 6 2014 NaN
10 15 6 2014 NaN
11 15 6 2014 NaN



10. Re: Organizar dados

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/04/2020 - 03:28h

carolinaq escreveu:

Marcelo, meu arquivo1.txt tem 719 linhas e o arquivo2.txt tem 720 linhas. Quando faço o mescla.awk só me retorna 30 linhas, quando deveria retornar 719 linhas. Você poderia me ajudar a identificar o erro?

Alterei algumas coisas pois meus dados estão assim agora:

0 15 6 2014 0.6
1 15 6 2014 0.4
2 15 6 2014 1.19
3 15 6 2014 0.2
4 15 6 2014 0.2
5 15 6 2014 0.4
6 15 6 2014 0.4
7 15 6 2014 0.2
8 15 6 2014 0.2
9 15 6 2014 NaN
10 15 6 2014 NaN
11 15 6 2014 NaN


O que é cada coluna? Por acaso é hora, dia, mês, ano e valor? E os arquivos vêm preordenados? Se sim, você pode adaptar o algoritmo que eu mostrei acima, incluindo a leitura da hora, e convertendo a formatação da data para YYYYmmddHH, para que também a hora seja levada em consideração.

O fato de os arquivos estarem ordenados permite ao algoritmo dispensar o uso de arrays para guardar os valores do primeiro arquivo na memória e depois compará-los com o do segundo arquivo, pois faz com que seja possível percorrer ambos em paralelo, sabendo quando há dados comuns aos dois ou presentes em apenas um deles.

Não gravar dados em memória é vantajoso principalmente quando você trabalha com arquivos muito grandes, que poderiam provocar estouro de memória se inteiramente lidos para arrays (ou outra estrutura de dados qualquer), mas também é útil em casos pequenos, quando a entrada de dados assim favorece -- por exemplo, estando preordenada.

O algoritmo do Marcelo usa arrays, o que, em princípio permitiria tratar arquivos fora de ordem, e também usa a informação que você passou inicialmente de que iria suprimir os NaNs numa etapa seguinte, e já fez isso para você. A "falha" da sugestão dele é que ele só colocou o dia como índice do array, pois ele foi bem específico para o conjunto de dados que você mostrou na primeira postagem, nos quais todos os dados estavam no mesmo mês e ano.

Você quer a impressão de dados com NaN? Se não, você pode usar um algoritmo parecido com o do Marcelo, desde que troque o índice de simplesmente o dia para uma composição que leve toda a data em consideração ("YYYYmmdd" ou "YYYYmmddHH"). Note, porém, que se os arquivos não estiverem ordenados (particularmente o segundo), a saída também não estará.

Eu acho que você quer uma saída ordenada. Pelo menos foi o que seu primeiro exemplo mostrou.

Se você quiser a impressão dos NaNs, o algoritmo do Marcelo não vai servir do jeito como está. Ele terá de ser alterado, e vai acabar ficando parecido com a solução que eu mostrei.

Minha sugestão original pode ser usada mesmo que você não queira os NaNs. Para tanto, basta suprimir a impressão nos casos em que as datas são diferentes ou se chegou ao fim de apenas um dos arquivos, deixando apenas aquela que existe no caso em que as duas datas são iguais.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


11. Re: Organizar dados [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/04/2020 - 13:16h

Um exemplo de código em C++ que permite ler dois arquivos de entrada preordenados, cada um deles com linhas no formato "dia mês ano valor". Ele é uma implementação do algoritmo que eu mostrei inicialmente.
#include <iostream> // Entrada e saída padrão (terminal, no nosso caso).
#include <fstream> // Operações com arquivos.

#include <cmath> // NaN.


using namespace std;


// Tipo de dados para representar e comparar datas.
struct data_t {
unsigned ano, mes, dia;

bool operator<(data_t outro){
return
ano<outro.ano || (ano==outro.ano && (
mes<outro.mes || (mes==outro.mes && (
dia<outro.dia
))
))
;
}
};

// Função para imprimir a data num formato desejado.
ostream &operator<<(ostream &os, data_t data){
return os << data.dia << ' ' << data.mes << ' ' << data.ano;
}


int main(){
ifstream arq1("/tmp/arq1.txt"), arq2("/tmp/arq2.txt");
data_t data1, data2;
double valor1, valor2;
arq1 >> data1.dia >> data1.mes >> data1.ano >> valor1;
arq2 >> data2.dia >> data2.mes >> data2.ano >> valor2;
while(arq1 || arq2){
if(arq1 && (!arq2 || data1<data2)){
// Se quiser surprimir NaNs do arq2, comente linha abaixo.
cout << data1 << ' ' << valor1 << ' ' << NAN << '\n';
arq1 >> data1.dia >> data1.mes >> data1.ano >> valor1;
}
else if(arq2 && (!arq1 || data2<data1)){
// Se quiser surprimir NaNs do arq1, comente linha abaixo.
cout << data2 << ' ' << NAN << ' ' << valor2 << '\n';
arq2 >> data2.dia >> data2.mes >> data2.ano >> valor2;
}
else{
cout << data1 << ' ' << valor1 << ' ' << valor2 << '\n';
arq1 >> data1.dia >> data1.mes >> data1.ano >> valor1;
arq2 >> data2.dia >> data2.mes >> data2.ano >> valor2;
}
}
}


Se você quiser acrescentar a hora ao formato, acrescente um campo para a hora junto ao ano, mês e dia, e faça com que esse campo seja lido, preenchido e impresso nos mesmos moldes que os demais campos.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


12. Re: Organizar dados [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 17/04/2020 - 16:07h


carolinaq escreveu:

msoliver escreveu:


carolinaq escreveu:

msoliver escreveu:

Boa tarde Carolina.
Esclareça por favor:
Pois depois de obter esta saída, irei eliminar as linhas que não contém informação nas duas últimas colunas.
Com base neste exemplo de saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2
3 1 1998 40.4 NaN
4 1 1998 NaN 39.6
5 1 1998 30.8 NaN
6 1 1998 NaN 33.0

As linhas que tem "NaN" seriam excluídas, é isso?
Se for assim a bastante simples.....
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Sim! Vou eliminar as linhas que tem NaN

Boa tarde Carolina, segue, com BASE nos dados POSTADOS INICIALMENTE.
cat mescla.awk

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1]) )
printf "%s %s %d %s %s\n" ,cp1[$1],cp2[$1],cp3[$1],cp4[$1],$4
}

Modo de uso:
awk -f mescla.awk arq1.txt arq2.txt
Saída:
1 1 1998 32.5 28.2
2 1 1998 37.2 35.2

Observe o nome dos arquivos!
______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


Marcelo, meu arquivo1.txt tem 719 linhas e o arquivo2.txt tem 720 linhas.
Quando faço o mescla.awk só me retorna 30 linhas, quando deveria retornar 719 linhas.
Você poderia me ajudar a identificar o erro?

{
if(FILENAME=="arq1.txt"){cp1[$1]=$1;cp2[$1]=$2;cp3[$1]=$3;cp4[$1]=$4;cp5[$1]=$5;}
if(FILENAME=="arq2.txt" && ($1==cp1[$1] && $2==cp2[$1] && $3==cp3[$1] && $4==cp4[$1]))
printf "%s %s %s %d %s %s\n",cp1[$1],cp2[$1],cp3[$1],cp4[$1],cp5[$1],$5
}


Alterei algumas coisas pois meus dados estão assim agora:

0 15 6 2014 0.6
1 15 6 2014 0.4
2 15 6 2014 1.19
3 15 6 2014 0.2
4 15 6 2014 0.2
5 15 6 2014 0.4
6 15 6 2014 0.4
7 15 6 2014 0.2
8 15 6 2014 0.2
9 15 6 2014 NaN
10 15 6 2014 NaN
11 15 6 2014 NaN

Carolina, boa tarde.
O "mescla.awk", somente retorna as linhas onde os campos: 1 2 e 3 do arq1.txt e arq2.txt são iguais.
Como os dados foram alterados, é necessário que envie os arquivos... E, defina quais linhas são necessárias,pois,
anteriormente cada linha tinha 4 campos, agora tem 5.....
Vou te enviar uma mensagem, na mesma, terá o meu e-mail, caso queira, envie os arquivos....


______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________



01 02