Regex 查找出现多次的单词

Regex 查找出现多次的单词,regex,linux,string,perl,shell,Regex,Linux,String,Perl,Shell,我有一个文本文件,其中每行是一组逗号分隔的单词。我需要知道一个单词是否被重复,如果是的话,它是在哪一行重复的。例如: word1, word2, word3, word4, word5 word6, word4, word7, word8 输出: word4: 1,2 我正在试验一个perl脚本,它在逐行读取文件时创建一个从单词到行号的映射,但我想知道是否有更简单的方法。在打印任何内容之前,您需要阅读所有行,因此您所描述的是您必须做的,但实际上非常简单 my %seen; while (&l

我有一个文本文件,其中每行是一组逗号分隔的单词。我需要知道一个单词是否被重复,如果是的话,它是在哪一行重复的。例如:

word1, word2, word3, word4, word5
word6, word4, word7, word8
输出:

word4: 1,2

我正在试验一个perl脚本,它在逐行读取文件时创建一个从单词到行号的映射,但我想知道是否有更简单的方法。

在打印任何内容之前,您需要阅读所有行,因此您所描述的是您必须做的,但实际上非常简单

my %seen;
while (<>) {
   for (split /\s*,\s*/) {
      push @{ $seen{$_} }, $.;
   }
}

for my $word (keys(%seen)) {
   next if @{ $seen{$word} } < 2;
   print($word . ": " . join(",", @{ $seen{$word} }) . "\n");
}
my%seed;
而(){
对于(拆分/\s*,\s*/){
推送@{$seen{$}},$。;
}
}
对于我的$word(键(%seed)){
下一个if@{$seen{$word}}<2;
打印($word.:“.join(“,”,@{$seen{$word})。“\n”);
}

在打印任何内容之前,您需要阅读所有行,因此您所描述的内容是您必须要做的,但事实证明这非常简单

my %seen;
while (<>) {
   for (split /\s*,\s*/) {
      push @{ $seen{$_} }, $.;
   }
}

for my $word (keys(%seen)) {
   next if @{ $seen{$word} } < 2;
   print($word . ": " . join(",", @{ $seen{$word} }) . "\n");
}
my%seed;
而(){
对于(拆分/\s*,\s*/){
推送@{$seen{$}},$。;
}
}
对于我的$word(键(%seed)){
下一个if@{$seen{$word}}<2;
打印($word.:“.join(“,”,@{$seen{$word})。“\n”);
}

使用Perl一行程序:

perl -F/,\s*/ -lanE 'push @{$w{$_}}, $. for @F; }{ say "$_: @{$w{$_}}" for grep {@{$w{$_}} > 1} sort keys %w' words.txt
开关

  • -F
    :用于-a开关的split()模式(//是可选的)
  • -l
    :启用行结束处理
  • -a
    :在空间上拆分行并将其加载到数组中
    @F
  • -n
    :为输入文件中的每一行创建
    while(){…}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码。(
    -E
    启用所有可选功能)

使用Perl一行程序:

perl -F/,\s*/ -lanE 'push @{$w{$_}}, $. for @F; }{ say "$_: @{$w{$_}}" for grep {@{$w{$_}} > 1} sort keys %w' words.txt
开关

  • -F
    :用于-a开关的split()模式(//是可选的)
  • -l
    :启用行结束处理
  • -a
    :在空间上拆分行并将其加载到数组中
    @F
  • -n
    :为输入文件中的每一行创建
    while(){…}
    循环
  • -e
    :告诉
    perl
    在命令行上执行代码。(
    -E
    启用所有可选功能)

我想你的意思是下一步
,除非
(或者
我想你在编写Perl代码时会小心选择。你在
print
语句中使用括号和点运算符的原因是什么?我自己会选择
printf
。@Borodin,甚至从来没有把它当作一个选项。
printf(“%s:%s\n”,$word,join(“,”,@{$seen{$word}});
可能确实稍微清晰一点,尽管
和换行符在现有代码中非常突出。我想你的意思是
下一步,除非
(或者
我想你在编写Perl代码时会小心选择。你在
print
语句中使用括号和点运算符的原因是什么?我自己会选择
printf
。@Borodin,从来没有考虑过它作为选项。
printf(%s:%s\n“,$word,join(,“,@{$seen{$word}));
可能确实更清楚一点,尽管
和换行符在现有代码中非常突出。一个单词可以在一行中出现两次吗?例如
单词1,单词1,单词2….
@TLP:在我的应用程序中,每个单词在一行中只出现一次。一个单词可以在一行中出现两次吗?例如
单词1,单词1,单词2….
@TLP:在我的应用程序中但是,每个单词在一行中只出现一次。米勒回来了!+1,因为一行可以解释。米勒回来了!+1,因为一行可以解释。