找出不止一次出现的单词

时间:2015-02-27 18:14:19

标签: regex linux string perl shell

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

word1, word2, word3, word4, word5
word6, word4, word7, word8

输出:

word4: 1,2

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

2 个答案:

答案 0 :(得分:3)

你需要阅读所有的行才能打印任何内容,所以你所描述的是你必须要做的事情,但事实证明这很简单。

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");
}

答案 1 :(得分:2)

使用Perl one-liner:

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

切换

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