현재 다음 중 하나가 포함된 파일에서 데이터를 추출하고 있습니다.
342163477\|405760044\|149007683\|322391022\|77409125\|195978682\|358463993\|397650460\|171780277\|336063797\|397650502\|357636118\|168490006...............
목록은 길며 약 700개의 서로 다른 값을 포함합니다.
가장 효율적인 추출 방법은 무엇입니까? 10/20/50/100 부분으로 나눌 수 있나요? 아니면 다른 유닉스 방식이 있나요? 이 grep은 추가 분석을 위해 Python으로 파이프되며 이는 충분히 빠릅니다.
답변1
이 숫자를 모두 파일에 숫자당 한 줄씩 입력하고 또는 스위치와 grep
함께 사용하세요 .-f
--file=
grep -f filewithcodestosearchfor filetosearchin
답변2
플래그를 사용해 보셨나요 --mmap
?
남성의 경우:
--mmap If possible, use the mmap(2) system call to read input, instead of the default read(2) system call. In some situations, --mmap yields better performance. However, --mmap can cause undefined behavior (including core dumps) if an input file shrinks while grep is operating, or if an I/O error occurs.
답변3
파일에 넣는 대신 다음을 수행할 수 있습니다.
grep -F '342163477
405760044
149007683
322391022
77409125
195978682
358463993
397650460
171780277
336063797
397650502
357636118
168490006' file
다시 말하지만, 이것은 또한 이식 가능/표준입니다(BRE에서 사용되는 grep -Ff
것처럼\|
grep
아니요표준/휴대용).
또한, 진짜 문제는 무엇인가? 이 숫자가 포함된 행을 가져오시겠습니까? 아니면 파일에 어떤 숫자가 나타나는지 알고 싶으십니까? 파일이 정렬되어 있나요? 파일의 각 줄에 숫자가 있습니까? ...
답변4
다른 답변에 대한 의견에서 언급했듯이 grep -F
가능하면 /를 사용하십시오. fgrep
이는 모든 정규식 문자를 리터럴로 처리합니다. 이 옵션과 결합 -f file
하고 패턴을 한 줄에 한 패턴씩 파일에 넣으면 교대 효과를 얻을 수 있습니다.
정규식을 포함하는 패턴이 필요한 경우 클래식 ERE 구문으로 제한하고 grep -E
/ 를 사용해 보세요 egrep
. 클래식 ERE 구문에는 역참조가 포함되어 있지 않으므로 다음과 같은 형식의 패턴이 없습니다 ...(pat)...\1...
. 이는 아마도 DFA를 사용하여 일치를 수행하고 더 효율적일 것입니다. 그러나 이는 egrep 구현에 따라 다릅니다. 이에 대한 추가 논의는여기. 일부 egrep 구현(예: Gnu)은 역참조가 있는 패턴을 허용하지만 이러한 패턴을 일치시킬 때 여기에 언급된 효율성 이점은 확실히 발생하지 않습니다.
이론적 관심을 위해 최적화에 대해 언급합니다 egrep
. 의도한 사용에 도움이 되는지 테스트해 볼 가치가 있기 때문입니다. manatwork가 말했듯이 Gnu의 grep 엔진은 당신보다 최적화 방법을 더 잘 알아내는 것 같습니다.