combina dois arquivos csv com base na condição

0

Eu tenho dois arquivos csv para dizer A.csv e B.csv  A.csv contém (o tamanho do arquivo é maior que 5gb)

64.234     20.342   786
63.231     20.124   765
63.652     20.857    387

B.csv contém (o tamanho do arquivo é maior que 5 gb)

  63.231   20.124    234
  63.652   20.857    383
  64.234   20.342    876

Eu quero o arquivo final como

    64.234    20.342     786   876
    63.231    20.124     765    234
    63.652     20.857     387    383

Longitude e latitude serão usadas para condição Quando a longitude e a latitude são iguais, então o valor da banda será armazenado Existe alguma solução rápida para isso usando sed, script ou qualquer ferramenta ... !!!!

    
por gaurav singh 06.02.2017 / 10:17

4 respostas

3

Não há solução rápida para o seu problema, uma vez que os arquivos de entrada não estão classificados. Você poderia fazer algo assim:

join -o 0,1.2,1.3,2.3 <(sort A.csv) <(sort B.csv)
    
por 06.02.2017 / 11:24
0

Tente com este:

for i in 'awk '{print $1}' A.csv';
 do
         t1='awk -v a="$i" '$1==a {print $3}' A.csv';
         awk -F' ' -v a="$i" -v b="$t1" '$1==a {print $1" "$2" "$3" " b }' B.csv;
 done

Espero que tenha ajudado.

    
por 06.02.2017 / 11:31
0

Embora a pergunta seja imprecisa sobre quais campos devem ser usados para associação, parece que é campo1 e campo2 (com erro de digitação em A.csv field2=20.875 em vez de 20.857 ).

Se você precisa se juntar apenas no primeiro campo, a solução da Michaels é ok.
Se você precisa se juntar nos dois primeiros campos, você pode usar:

join <(sed -e 's/  */:/' a.csv | sort) <(sed -e 's/  */:/' b.csv | sort)

(talvez seja necessário ajustar o regex de sed se os campos não forem separados apenas por espaços). A solução da Rakesh é bastante ineficiente, pois varre tanto A.csv quanto B.csv para cada linha em A.csv .

    
por 06.02.2017 / 11:46
0

Com tantos dados, você deve considerar a importação dos dados em um banco de dados, criando índices em (latitude, longitude) e então você pode obter seus resultados com

select a.latitude, a.longitude, a.value, b.value
from a, b
where a.latitude  = b.latitude
  and a.longitude = b.longitude;
    
por 06.02.2017 / 15:57