다른 파일에 존재하는 필드를 바꾸면서 대용량 파일에서 찾아서 바꾸는 가장 빠른 방법

다른 파일에 존재하는 필드를 바꾸면서 대용량 파일에서 찾아서 바꾸는 가장 빠른 방법

두 개의 파일이 있습니다. File1은 60개 필드가 있는 csv입니다.

111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....

File2는 매핑 파일입니다.

OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9 

이제 내가 하고 싶은 일은 파일 1의 필드 2에 있는 것입니다. 해당 필드를 필드 2와 일치하는 파일 1의 필드 1로 바꿔야 합니다. 예:

이제 내가 하고 싶은 일은 file1의 필드 2를 필드 2와 일치하는 file2 줄의 필드 1로 바꾸는 것입니다. 예:

파일 1에서:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....

할 것이다

111,OPUM04181,22062014184500,20,0..... 

그 중 OPUM04181⇔는 Check1|^/h1/h2/h3file2에 매핑됩니다.

내 한계는 File1과 file2의 값 세트가 동일하지 않다는 것입니다. 또한 두 파일 모두 300만 개의 행을 가지고 있습니다.

이것이 내가 시도하는 것입니다:

  • file1에서 필드 2를 가져오기 위해 루프를 실행했습니다.
  • file2에 필드가 있는지 확인 중입니다.
  • 존재하는 경우 file2의 필드 1을 사용합니다.
  • file1 에서 교체 field2를 사용하고 있습니다 sed s///g. 그러나 이것은 시간이 많이 걸립니다.

File1도 정렬할 수 없습니다.

더 빠른 방법은 무엇입니까?

답변1

awk -F, -v OFS=, '
    NR==FNR {opu[$2]=$1; next} 
    $2 in opu {$2 = opu[$2]; print}
' file2 file1

이는 "매핑된" 파일을 메모리로 읽고 file1의 두 번째 필드를 대체합니다. 각 파일은 한 번만 처리됩니다.

출력은 표준 출력으로 이동하므로 파일을 "제자리"로 바꾸려면 다음을 수행하십시오.

awk ... file2 file1 > tempfile && mv tempfile file1

관련 정보