두 개의 csv 파일이 있습니다. A.csv 및 B.csv A.csv에 포함되어 있다고 가정해 보겠습니다(파일 크기가 5GB 이상).
64.234 20.342 786
63.231 20.124 765
63.652 20.857 387
B.csv에는 다음이 포함됩니다(파일 크기가 5GB보다 큼).
63.231 20.124 234
63.652 20.857 383
64.234 20.342 876
나는 다음과 같은 최종 파일을 원한다
64.234 20.342 786 876
63.231 20.124 765 234
63.652 20.857 387 383
경도와 위도가 동일할 때 조건으로 경도와 위도가 사용됩니다. sed, 스크립트 또는 도구를 사용하여 빠른 솔루션이 있는 경우 밴드 값이 저장됩니다...! ! ! !
답변1
입력 파일이 정렬되지 않았으므로 문제를 빠르게 해결할 수 없습니다. 그러나 다음과 같이 할 수 있습니다.
join -o 0,1.2,1.3,2.3 <(sort A.csv) <(sort B.csv)
답변2
조인에 어떤 필드를 사용해야 하는지에 대한 질문은 정확하지 않지만 field1 및 field2처럼 보입니다( A.csv
field2=20.875
대신 철자가 틀렸습니다 20.857
).
첫 번째 필드에만 참여해야 한다면 Michael의 솔루션이 효과가 있을 것입니다.
처음 두 필드를 조인해야 하는 경우 다음을 사용할 수 있습니다.
join <(sed -e 's/ */:/' a.csv | sort) <(sed -e 's/ */:/' b.csv | sort)
(필드가 공백으로만 구분되지 않은 경우 sed 정규식을 조정해야 할 수도 있습니다.) Rakesh의 솔루션은 모든 행을 A.csv
동시에 스캔하므로 다소 비효율적입니다 .B.csv
A.csv
답변3
데이터가 너무 많으면 데이터를 데이터베이스로 가져오는 것을 고려해야 하며 (위도, 경도)에 대한 인덱스를 만든 다음 결과를 얻을 수 있습니다.
select a.latitude, a.longitude, a.value, b.value
from a, b
where a.latitude = b.latitude
and a.longitude = b.longitude;
답변4
이 시도:
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