【问题标题】:Perl- Don't allow same line to show twicePerl-不允许同一行显示两次
【发布时间】:2015-11-24 08:20:05
【问题描述】:

我有一个 perl 脚本,我想阻止输入,例如

Referer: http://www.apple.com/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/.
Referer: http://www.apple.com/apple-events/september-2015/.

从显示同一行两次,期望的输出

Referer: http://www.apple.com/
Referer: http://www.apple.com/diversity/
Referer: http://www.apple.com/
Referer: http://www.apple.com/apple-events/september-2015/

另外,我怎样才能摆脱“。”在每行的末尾? 提前致谢!

【问题讨论】:

  • 相同的非连续行呢?
  • Referer: http://www.apple.com/ 行在您的输出中出现两次...我假设您的意思是您只想摆脱 连续 重复行?
  • 你觉得 sed 怎么样? (Perl 可以做到,但这似乎有点过头了。)
  • @Beta perl -i -ne'next if $_ eq $prev; $prev = $_; s/\.$//; print' /path/to/file 有什么过火之处? ;)
  • @ThisSuitIsBlackNot:你的意思是与sed 's/.$//' filename | uniq相比?

标签: macos bash perl


【解决方案1】:

首先问问自己,你将如何用铅笔和纸解决这个问题,你在源页面上一次发现一行,然后将它们写到另一个页面上。你可能有一块白板来临时记录事情。

  1. 从源页面读取一行。
  2. 如果之前没有看到过这条线(即,它没有写在您的白板上),请将它写在您的新纸上。 (当然,您阅读的第一行内容以前从未见过)。
  3. 通过在白板上写下您刚刚阅读的行来保存它。
  4. 从源页面读取下一行。
  5. 看看白板上有没有写。
  6. 如果没有写在白板上,请写在目标页面上。
  7. 擦掉你的白板,在上面写下你刚刚读到的那一行,以便以后再检查。
  8. 只要源页面上还有待读取的行,就重复。

所以这是该算法的 Perl 实现。但是,相同的算法可以用多种语言实现。

open my $infile, '<', shift or die $!;
my $whiteboard = q{};
while( <$infile> ) {
    print unless $_ eq $whiteboard;
    $whiteboard = $_;
}

这可以写成这样的 Perl 单行:

perl -ne 'print unless defined $tmp && $tmp eq $_; $tmp = $_;' filename.txt

您问题的第二部分是如何消除尾随点。所以对于第一个例子,你可以这样做:

open my $infile, '<', shift or die $!;
my $whiteboard = q{};
while( <$infile> ) {
    s/\.$//;
    print unless $_ eq $whiteboard;
    $whiteboard = $_;
}

或者作为单行:

perl -ne 's/\.$//; print unless defined $tmp && $tmp eq $_; $tmp = $_;' filename.txt

【讨论】:

    【解决方案2】:

    如果你不在乎顺序,你可以试试这个:

    perl -nale 's/\.$//; $h{$_}++; END{foreach(keys %h){print}}' /path/to/file
    

    使用s/\.$//; 删除行尾的.。并使用哈希删除重复的行。

    【讨论】:

    • 这没有回答问题。如果问题是“如何在不关心顺序的情况下从文件中删除重复项。”,那就太好了。但是当问题是“如何在允许不连续重复的同时防止连续重复,同时消除出现在行尾的点?”,它并不接近。
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2021-11-01
    相关资源
    最近更新 更多