큰 텍스트 파일(약 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
(올바른 일을 하고 있다고 확신하는 경우에만 이것을 추가하세요).