Linux

如何在大文件中查找內容

  • August 29, 2019

我有一個大尺寸的文本文件。(大約 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

最後,這些腳本都沒有經過全面測試。我沒有要搜尋的巨大文本文件或要搜尋的巨大“句子”。因此,這些是作為一個可能的正確方向的近似指針提供的,而不是作為完整的工作程式碼。

引用自:https://unix.stackexchange.com/questions/537990