Perl - 在文件或数组中查找重复行

标签 perl line-processing

我正在尝试从文件句柄中打印重复的行,而不是删除它们或我在其他问题中看到的任何其他内容。我对 perl 的经验不足,无法快速做到这一点,所以我在这里问。有什么方法可以做到这一点?

最佳答案

使用标准 Perl 简写:

my %seen;
while ( <> ) { 
    print if $seen{$_}++;
}

作为“单线”:
perl -ne 'print if $seen{$_}++'

更多数据?这打印 <file name>:<line number>:<line> :
perl -ne 'print ( $ARGV eq "-" ? "" : "$ARGV:" ), "$.:$_" if $seen{$_}++'
%seen的说明:
  • %seen声明一个哈希。对于输入中的每个唯一行(在本例中来自 while(<>))$seen{$_}将在由该行的文本命名的散列中有一个标量槽(这就是 $_ 在 has {} 大括号中所做的)。
  • 使用后缀增量运算符( x++ ),我们获取表达式的值,记住在表达式之后增加它。所以,如果我们还没有“看到”这条线 $seen{$_}未定义——但是当强制进入这样的数字“上下文”时,它被视为 0——并且为假。
  • 然后它增加到 1。

  • 所以,当 while开始运行,所有行都是“零”(如果它有助于您可以将这些行视为“不是 %seen”)然后,我们第一次看到一行,perl采用未定义的值 - 失败 if - 并将标量槽处的计数增加到 1。因此,对于任何 future 发生的事件,当它通过 if 时,它都是 1。条件并打印出来。

    现在正如我上面所说的,%seen声明一个散列,但带有 strict关闭后,可以当场创建任何变量表达式。所以 perl 第一次看到 $seen{$_}它知道我在找 %seen ,它没有它,所以它创建了它。

    一个额外的好处是,最后,如果您愿意使用它,您可以计算每行重复的次数。

    关于Perl - 在文件或数组中查找重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884401/

    相关文章:

    perl - 在 mod_perl2 下 fork 是个坏主意吗?

    bash - 从 bash 中的大文件中获取随机行

    java - 用C风格的Java解析?

    c++ - 如何在 C++ 中逐行迭代 cin?

    string - 在 Perl 中迭代字符串

    perl - 如果 Perl 代码出现问题,最佳做法是什么?

    perl - 如何检查参数是否同时具有文件名和路径或仅具有文件名

    regex - 提取每一级括号的内容

    perl - 用 perl 分割线