Linux
如何在大文件中查找內容
我有一個大尺寸的文本文件。(大約 2GB)
我叫你A.txt
我想知道A.txt文件中是否包含我想要的句子(****句子大小為1Byte~500MB)
另外,如果句子包含在A.txt中,我想知道包含在 byte 中的位置
#!/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
最後,這些腳本都沒有經過全面測試。我沒有要搜尋的巨大文本文件或要搜尋的巨大“句子”。因此,這些是作為一個可能的正確方向的近似指針提供的,而不是作為完整的工作程式碼。