간격별로 효율적으로 파일을 grep 정렬

간격별로 효율적으로 파일을 grep 정렬

내 파일에는 수백만 줄이 있고 메모리에 상주하며 /dev/shm/tmp.file여러 스레드에서 액세스되며 다음과 같습니다.

831092,25a1bd66f2eec71aa2f0a8bb3d,/path/to/a/file
4324,8d83c29e4d8c71bd66f1bd66fs,/path/to/another/file
...

,그리고 두 번째 부분 이후의 부분을 기준으로 정렬합니다 sort -t , -k3. 일반적으로 각 줄은 모양을 가지며 [0-9]*,[0-9a-z]*,.*파일 경로에는 \0또는를 제외한 모든 문자가 포함될 수 있습니다 \n.

추가 복사본을 만들지 않고 가능한 한 빨리 특정 디렉터리에 있는 모든 파일의 줄을 추출해야 합니다. 파일이 이런 방식으로 정렬되어 있으므로 내가 찾고 있는 줄은 파일의 끊어지지 않은 덩어리입니다.

현재는 사용하고 있지만 grep -F ',<directory>' /dev/shm/tmp.file첫 번째 적중에서 이진 검색을 수행한 다음 블록을 한 줄씩 확장하거나 각 새 줄에 대해 전체 파일을 읽지 않고 다른 이진 검색을 사용하는 것이 훨씬 빠르다는 것을 알고 있습니다. 그러나 이것은 bash 스크립트에 통합되어야 하며 bash에서 lseek와 같은 작업을 수행할 수 있는 방법을 찾지 못했습니다.

가지다스그레프그러나 전체 행을 정렬해야 합니다.

',<directory>'보다 빠르게 모든 일치 항목을 추출하려면 어떻게 해야 합니까 grep -F?

편집하다:입력은 /dev/shm/tmp.file이 추출을 수행하는 데에만 사용됩니다. 따라서 작업을 더 쉽게 만들기 위해 어떤 방식으로든 전처리하는 것은 선택 사항입니다.

편집하다: a.baa/b모든 하위 디렉터리가 블록 내에 포함되어야 하므로 및 사이의 순서 는 문제가 되지 않습니다.

답변1

831092,25a1bd66f2eec71aa2f0a8bb3d,/path/to/a/file다음으로 변경 하면/path/to/a/file,831092,25a1bd66f2eec71aa2f0a8bb3d

다음을 수행할 수 있습니다.

look /path/to/ /dev/shm/tmp.file

lookPOSIX에서 지정하지 않았지만 매우 일반적인 1970년대의 전통적인 Unix 유틸리티입니다. 데비안과 그 파생물에서는 패키지에서 찾을 수 있고 bsdmainutils, util-linux에서도 하나를 찾을 수 있습니다(같은 이름의 데비안 패키지가 아닌 BSD에서도 복사했습니다).

look mmap()s 파일을 검색하고 이진 검색을 수행합니다.

grep그러나 해당 옵션을 전달하지 않는 한 데비안 구현은 기본 선형 검색으로 되돌아갑니다 -b(한숨). 따라서 Debian 또는 파생 제품에서는 다음이 필요합니다.

look -b /path/to/ /dev/shm/tmp.file

또한 일부 구현에는 처리할 수 있는 파일 크기에 제한이 있습니다(Debian에 해당하는 버그 및 패치 보기)

관련 정보