CSV 파일의 필드를 기반으로 대용량 텍스트 파일의 문자열 바꾸기

CSV 파일의 필드를 기반으로 대용량 텍스트 파일의 문자열 바꾸기

큰 텍스트 파일(약 2GB)이 있습니다. 다음 필드가 포함된 CSV 파일이 있습니다.

rowID,pattern,other
1,abc_1z1,90
2,abc_1z2,90
3,abc_1z10,80
4,abc_3p1,77
...

내 관심은 다음과 같이 대용량 파일의 내용을 바꾸는 것입니다. 큰 파일의 문자열이 CSV(두 번째 필드)의 "패턴"과 일치할 때마다 해당 문자열을 해당 "rowID"(첫 번째 필드)로 대체합니다.

이것이 내가 sed를 사용해 본 방법인데, 이는 매우 느립니다(또한 파일의 내부 교체로 인해). 하지만 더 빠른 해결책이 있을까요?

while read f1 f2 f3; 
do 
    sed -i "s/$f2/$f1/g" bigfile; 
done < map.csv

map.csv에는 500,000개 이상의 행이 포함되어 있습니다.

답변1

sed는 문자열이 아닌 정규식을 대체한다는 점에 유의하세요. 현재 솔루션에서 이를 사용하고 있으므로 이것이 귀하의 사용 사례에 문제가 되지 않는다고 가정합니다.

map.csv한 가지 접근 방식은 다음 함수에 대한 단일 호출에 전달될 일련의 표현식으로 전처리하는 것입니다 sed -f.

awk -F, 'NR>1 {printf "s/%s/%s/g\n", $2, $1}' map.csv | sed -f - bigfile

-i(올바른 일을 하고 있다고 확신하는 경우에만 이것을 추가하세요).

관련 정보