如何删除重复行?
我当前的代码:
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");
Input:
india
australia
america
singapore
india
america
预期输出:
india
australia
america
singapore
使用这个 Perl 一行代码来删除all重复项,无论是否相邻:
perl -ne 'print unless $seen{$_}++;' input.txt > output.txt
仅删除adjacent重复项(如 UNIX 中uniq https://man7.org/linux/man-pages/man1/uniq.1.html命令):
perl -ne 'print unless $_ eq $prev; $prev = $_; ' input.txt > output.txt
Perl 语句使用这些命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。
-n
:一次循环输入一行,将其分配给$_
默认情况下。
当第一次看到这条线时,$seen{$_}
首先求值,结果为 false,因此打印该行。然后,$seen{$_}
增加一,这使得每次再次看到该行时都为真(因此不再打印同一行)。
第一个单行避免一次将整个文件读入内存,这对于具有大量长重复行的输入可能很重要。仅将每行的第一次出现及其出现次数存储在内存中。
也可以看看:
- perldoc perlrun:如何执行Perl解释器:命令行开关 https://perldoc.perl.org/perlrun.html#Command-Switches
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)