我正在尝试从文件句柄中打印重复的行,而不是删除它们或我在其他问题中看到的任何其他内容。我对 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——并且为假。 所以,当
while
开始运行,所有行都是“零”(如果它有助于您可以将这些行视为“不是 %seen
”)然后,我们第一次看到一行,perl
采用未定义的值 - 失败 if
- 并将标量槽处的计数增加到 1。因此,对于任何 future 发生的事件,当它通过 if
时,它都是 1。条件并打印出来。现在正如我上面所说的,
%seen
声明一个散列,但带有 strict
关闭后,可以当场创建任何变量表达式。所以 perl 第一次看到 $seen{$_}
它知道我在找 %seen
,它没有它,所以它创建了它。一个额外的好处是,最后,如果您愿意使用它,您可以计算每行重复的次数。
关于Perl - 在文件或数组中查找重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5884401/