fgrep이 다른 파일(file2)에 있는 문자열이 포함된 파일(file1)에서 줄을 제거하는 가장 빠르고 효율적인 방법인지 궁금합니다.
나는 fgrep 함수가 다음과 같이 이 작업을 수행해야 한다는 것을 발견했습니다.
fgrep -v -f file1 file2 > file_with_lines_containing_search_strings_removed
이것이 매우 큰 파일에 작동하는지 모르겠습니다.
100,000줄이 포함된 두 개의 파일이 있는데 가능한 가장 빠른 방법을 사용하고 싶습니다.
감사해요.
7월 4일을 즐겁게 보내세요. 웃기게 생긴 미국인 여러분.
답변1
"다른 파일에서 발견된 문자열을 포함하는 행"("다른 파일의 regExp와 일치하는 문자열을 포함하는 행" 대신)을 원하는 경우 다음을 시도하십시오.
grep -vFf file1 file2 > file3
"grep -F"는 정규식 일치가 아니라 단순 문자열 일치(훨씬 더 빨리)
아니면 더 나은
grep -vwFf file1 file2 #respect word boundary
간단한 시간 비교 테스트:
1) 100,000개의 무작위 라인으로 샘플 파일 작성 2
seq 1000000 | shuf -n 100000 > file2
2) 임의의 10,000줄(삭제할 문자열)로 샘플 파일1을 구성합니다.
seq 1000000 | shuf -n 10000 > file1
31) 사용 grep -F
---time grep -vwFf file1 file2 > file31
real 0m0.111s
user 0m0.100s
sys 0m0.008s
32) -F
아니——time grep -vwf file1 file2 > file32
... 시간!
if file1 has just 300 lines -- 0.327s very fast
.... 600 lines -- 8.326s
.... 900 lines -- 35.334s
.... 1200 lines -- 1m31.433s (quadratic with file1 len?)
.... 10000 lines -- it is still calculating (several hours?)
UPDATED 1h03m53.983s
테스트 결론:
grep -vFf file1 file2
비교하다grep -vf
grep -vFf file1 file2
file1
대용량 파일에도 문제 없음grep -vf file1 file2
파일 크기가 증가하면 심각한 문제가 발생합니다file1
(크기가 500줄 또는 4KB를 초과하는 경우에만 표시됨).
답변2
네, 괜찮을 거예요. 최악의 시나리오는 제외할 문자열이 포함된 파일이 처리 중인 파일의 크기와 동일하고 메모리에 맞지 않는 것입니다. 이러한 상황이 발생하면 제외 파일을 청크로 분할하고 여러 번 실행하십시오.