gpt4 book ai didi

perl - 在 Perl 中查找文件中所有出现的字符串并打印其行号

转载 作者:行者123 更新时间:2023-12-02 21:10:04 28 4
gpt4 key购买 nike

我有一个包含 400000 行的大文件,每行包含许多由制表符分隔的关键字。

我还有一个文件,其中包含要匹配的关键字列表。假设此文件用作查找。

因此,对于查找表中的每个关键字,我需要搜索其在给定文件中出现的所有内容。并且应该打印出现的行号。

我已经尝试过了

#!usr/bin/perl
use strict;
use warnings;

my $linenum = 0;

print "Enter the file path of lookup table:";
my $filepath1 = <>;

print "Enter the file path that contains keywords :";
my $filepath2 = <>;

open( FILE1, "< $filepath1" );
open FILE2, "< $filepath2" ;

open OUT, ">", "SampleLineNum.txt";

while( $line = <FILE1> )
{
while( <FILE2> )
{
$linenum = $., last if(/$line/);
}
print OUT "$linenum ";
}

close FILE1;

这给出了关键字的第一次出现。但我需要所有出现的情况,并且关键字应该完全匹配。

精确匹配面临的问题是,例如我有关键字“hello”和“hello world”

如果我需要匹配“hello”,它也会返回包含“hello world”的行号我的脚本应该只匹配“hello”并给出其行号。

最佳答案

这是一个匹配所有关键字每次出现的解决方案:

#!usr/bin/perl
use strict;
use warnings;

#Lexical variable for filehandle is preferred, and always error check opens.
open my $keywords, '<', 'keywords.txt' or die "Can't open keywords: $!";
open my $search_file, '<', 'search.txt' or die "Can't open search file: $!";

my $keyword_or = join '|', map {chomp;qr/\Q$_\E/} <$keywords>;
my $regex = qr|\b($keyword_or)\b|;

while (<$search_file>)
{
while (/$regex/g)
{
print "$.: $1\n";
}
}

关键字.txt:

hello
foo
bar

搜索.txt:

plonk
food is good
this line doesn't match anything
bar bar bar
hello world
lalalala
hello everyone

输出:

4: bar
4: bar
4: bar
5: hello
7: hello

说明:

这将创建一个与关键字文件中的所有关键字相匹配的正则表达式。

<$keywords> - 当在列表上下文中使用它时,它返回文件所有行的列表。

map {chomp;qr/\Q$_\E/} - 这会从每行中删除换行符并应用 \Q...\E每行引用文字正则表达式运算符(这确保如果您有像“foo.bar”这样的关键字,它将把点视为文字字符,而不是正则表达式元字符)。

join '|', - 将结果列表连接成单个字符串,并用管道字符分隔。

my $regex = qr|\b($keyword_or)\b|; - 创建一个如下所示的正则表达式:

/\b(\Qhello\E|\Qfoo\E|\Qbar\E)\b/

此正则表达式将匹配您的任何关键字。 \b是单词边界标记,确保只有整个单词匹配: food不再匹配foo 。括号捕获 $1 中匹配的特定关键字。 。这就是输出打印匹配的关键字的方式。

我更新了解决方案以匹配给定行上的每个关键字并且仅匹配完整的单词。

关于perl - 在 Perl 中查找文件中所有出现的字符串并打印其行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com