조건에 따라 두 개의 CSV 파일을 병합합니다.

조건에 따라 두 개의 CSV 파일을 병합합니다.

두 개의 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.csvA.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

관련 정보