【问题标题】:how to remove duplicate lines using perl script如何使用 perl 脚本删除重复的行
【发布时间】:2021-06-23 16:06:40
【问题描述】:

我是来了解如何去除重复行的

代码:-

use strict;
use warnings;
my $input = input.txt;
my $output = output.txt;
my %seen;

open("OP",">$output") or die;
open("IP","<$input") or die;

while(my $string = <IP>) {
    my @arr1 = join("",$string);
    my @arr2 = grep { !$seen{$_}++ } @arr1;
    print "@arr2\n";
    print OP "@arr2\n";
}

close("IP");
close("OP");

输入:

india
australia
america
singapore
india
america

预期输出:

india
australia
america
singapore

【问题讨论】:

  • 我不知道您认为join 语句会做什么,但实际上它什么也没做。循环是多余的,您可以 grep 整个文件并立即打印它。例如。 perl -e'print grep !$seen{$_}++, &lt;&gt;;' input &gt; output
  • 推荐使用openModern Perl Programming
  • @Noor Perl 的join 用于将字符串片段连接成一个字符串
  • @Noor:请不要在同一个线程中提出新问题。恢复上一次编辑并提出一个新问题。它将帮助人们以更好的方式理解问题。谢谢。

标签: perl


【解决方案1】:

使用这个 Perl 单行代码:

perl -ne 'print unless $seen{$_}++;' input.txt > output.txt

Perl 单行程序使用这些命令行标志:
-e:告诉 Perl 查找内联代码,而不是在文件中。
-n:循环输入一行一次,默认分配给$_

当第一次看到该行时,首先评估$seen{$_},并且为假,因此打印该行。然后,$seen{$_} 加一,这使得每次再次看到该行时都为真(因此不再打印同一行)。

单行避免将整个文件一次全部读入内存,这对于具有大量长重复行的输入可能很重要。只有每行的第一次出现及其出现次数会存储在内存中。

另请参阅:
perldoc perlrun: how to execute the Perl interpreter: command line switches

【讨论】:

    【解决方案2】:

    从脚本中删除了不需要的代码行。

    这是更新后的脚本:

    use strict; use warnings;
    use Data::Dumper;
    
    my %seen;
    
    my @lines = <DATA>;
    chomp @lines;
    
    my @contries = grep { !$seen{$_}++ } @lines;
    print Dumper(\@contries);
    
    __DATA__
    india
    australia
    america
    singapore
    india
    america
    

    结果:

    $VAR1 = [
              'india',
              'australia',
              'america',
              'singapore'
            ];
    

    【讨论】:

      【解决方案3】:

      请调查以下代码 sn-p,您非常接近利用 %seen 哈希。

      use strict;
      use warnings;
      use feature 'say';
      
      my %seen;
      my @uniq;
      
      while( <DATA> ) {
          chomp;
          push @uniq, $_ unless $seen{$_};
          $seen{$_} = 1;
      }
      
      say for @uniq;
      
      __DATA__
      india
      australia
      america
      singapore
      india
      america
      

      输出

      india
      australia
      america
      singapore
      

      【讨论】:

        【解决方案4】:

        你把这一切都弄得太复杂了。您的代码的主要部分可以简化为:

        while (<IP>) {
          print unless $seen{$_}++;
        }
        

        甚至:

        print grep { ! $seen{$_}++ } <IP>;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-05
          • 1970-01-01
          • 2021-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多