큰 크기의 텍스트 파일이 있습니다. (약 2GB)
전화 할게A.txt
나는 알고 싶다.A.txt파일에 다음이 포함됨문장내가 원하는 (크기문장1Byte~500MB)
또한 만약에문장포함 된A.txt, 바이트에 포함된 위치를 알고 싶습니다.
답변1
#!/usr/bin/perl -w
use strict;
my $re=shift;
$re =~ s/[[:blank:]]+/\\s+/g;#/this comment only exists to fix SEs perl highlighting
my $blocksize = 100000;
my $filesize;
foreach my $file (@ARGV) {
open(F,"<",$file) || die "couldn't open '$file': $!\n";
$filesize=(stat($file))[7];
my @matches=();
for (my $i = 0; $i <= $filesize; $i+=$blocksize-(length($re))) {
seek(F,$i,0);
read F,$_,$blocksize;
@matches=(m/$re/gmo);
print join("\n",@matches), "\n" if (@matches);
};
close(F);
};
예를 들어 다른 이름으로 저장하고 puregyu.pl
실행 가능하게 만들고 chmod +x puregyu.pl
다음과 같이 실행합니다.
./puregyu.pl 'my sentence' a.txt
스크립트는 첫 번째 인수(검색 문자열 또는 패턴)를 취하고 [[:blank:]]
모든 공백(예: 공백 및 탭)을 (공백, 탭, 줄 바꿈 및 폼피드를 포함한 모든 공백)로 변경하여 \s*
여러 줄에 걸쳐 있는 경우에도 문장이 일치하도록 합니다. man perlrecharclass
공백을 정의하는 방법에 대한 자세한 내용은 참고자료를 참조하세요.
나머지 인수는 검색할 파일 이름으로 처리됩니다.
전체 입력 파일을 한 번에 메모리에 로드하는 것을 방지하기 위해 스크립트는 입력 "청크"를 한 번에 하나씩 검색합니다. 입력 손실을 방지하기 위해 ) $i
대신 명령문( )에서 사용하는 오프셋 변수를 증가시킵니다.read
($blocksize - length($re)
$blocksize
블록 크기를 1000000으로 설정하여 한 번에 100KiB를 읽습니다. 테스트할 만큼 큰 텍스트 파일이 없으므로 최상의 성능을 위해 이를 조정해야 할 수도 있습니다.
참고: 일치 항목의 바이트 위치를 얻는 것은 지금 할 수 있는 시간보다 더 많은 작업입니다. 다른 사람이 도움을 줄 수도 있습니다.
여러 줄로 구성된 "문장"을 일치시키려면 다음이 더 잘 작동합니다. 첫 번째 인수로 문자열 대신 파일 이름을 지정할 수 있습니다. 그런 다음 전체 파일을 삼켜 정규식으로 변환합니다.
#!/usr/bin/perl -w
use strict;
use File::Slurp;
my $re = read_file(shift,chomp=>1);
$re=~s/[[:blank:]]+/\\s+/gm;#/this comment only exists to fix SEs perl highlighting
my $blocksize = length($re)*5;
my $filesize;
foreach my $file (@ARGV) {
open(F,"<",$file) || die "couldn't open '$file': $!\n";
$filesize=(stat($file))[7];
my @matches=();
for (my $i = 0; $i <= $filesize; $i+=$blocksize-(length($re))) {
seek(F,$i,0);
read F,$_,$blocksize;
@matches=(m/$re/gmo);
print join("\n",@matches), "\n" if (@matches);
};
close(F);
};
예를 들어 다른 이름으로 저장하고 puregyu2.pl
실행 가능하게 만들고 chmod +x puregyu2.pl
다음과 같이 실행합니다.
./puregyu2.pl searchfile.txt a.txt
마지막으로 이러한 스크립트 중 어느 것도 완전히 테스트되지 않았습니다. 검색할 큰 텍스트 파일도 없고 검색할 큰 "문장"도 없습니다. 따라서 완전한 작업 코드가 아닌 가능한 올바른 방향에 대한 대략적인 포인터로 제공됩니다.