Como @choroba apontou nos comentários, tudo que você precisa fazer é remover o not
. Aqui está uma versão um pouco mais sofisticada:
#!/usr/bin/perl
## Add command line switches
use Getopt::Std;
## This hash will hold the options
my %opts;
## Read the options
getopts('d',\%opts);
# create names lookup table from first file
my %names;
while (<>) {
## Remove trailing newlines. This is needed
## for cases where you only have a single word
## per line.
chomp;
my $col1=split(/\s+/, $_);
$names{$col1} = 1;
last if eof;
}
# scan second file
while (<>) {
## Skip any lines we don't care about
next unless /^(\S+)/;
## Do we want the duplicates or not?
defined $opts{d} ?
do{print if $names{$1}} :
do{print unless $names{$1}};
}
Se você executar o script acima com o -d
flag ( foo.pl -d file
), ele imprimirá os nomes encontrados nos dois arquivos e, sem ele, imprimirá os nomes encontrados apenas no primeiro.
Note que você pode fazer praticamente a mesma coisa com grep
. Para encontrar as duplicações:
grep -wFf file1 file2
E para os não enganos:
grep -vwFf file1 file2
No entanto, as opções acima corresponderão aos padrões de file1
em qualquer lugar em file2
, não apenas no início da linha.