두 개의 파일이 있습니다. 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의 두 번째 필드를 대체합니다. 각 파일은 한 번만 처리됩니다.
출력은 표준 출력으로 이동하므로 파일을 "제자리"로 바꾸려면 다음을 수행하십시오.
awk ... file2 file1 > tempfile && mv tempfile file1