
두 개의 파일이 있습니다. 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/h3
file2에 매핑됩니다.
내 제약은 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의 두 번째 필드를 대체합니다. 각 파일은 정확히 한 번만 처리됩니다.
출력은 stdout으로 이동하므로 파일을 "제자리"로 바꾸려면
awk ... file2 file1 > tempfile && mv tempfile file1