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)
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 ... !!!!
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.
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
.
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;
Tags sed csv shell-script