如何使用Perl脚本删除重复行

bvuwiixz  于 11个月前  发布在  Perl
关注(0)|答案(4)|浏览(122)

如何删除重复行?
当前代码:

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

h7appiyu

h7appiyu1#

使用这个Perl一行程序删除所有重复项,无论是否相邻:

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

字符串
仅删除相邻重复项(如UNIX uniq命令):

perl -ne 'print unless $_ eq $prev; $prev = $_; ' input.txt > output.txt


Perl一行程序使用以下命令行标志:
-e:告诉Perl在线查找代码,而不是在文件中查找。
-n:一次循环一行输入,默认情况下将其分配给$_
当第一次看到该行时,$seen{$_}首先被求值,结果为假,因此该行被打印。然后,$seen{$_}递增1,这使得每次再次看到该行时它都为真(因此不再打印同一行)。
第一个一行程序避免了一次将整个文件阅读到内存中,这对于有很多长的重复行的输入是很重要的。只有每一行的第一次出现以及它的出现次数存储在内存中。

另见:

  • perldoc perlrun:如何执行Perl解释器:命令行开关
pbgvytdp

pbgvytdp2#

请研究以下代码片段,您非常接近使用%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

jdzmm42g

jdzmm42g3#

从脚本中删除不需要的代码行。
以下是更新后的脚本:

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'
        ];

j2qf4p5b

j2qf4p5b4#

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

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

字符串
或者甚至:

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

相关问题