Perl imprime as linhas correspondentes às colunas do arquivo 1 e do arquivo2

1

Aqui estou imprimindo o conteúdo do arquivo que não está correspondendo. Eu quero fazer um vice-versa, ou seja, imprimir as linhas do arquivo1 (aquelas que estão combinando no arquivo2)

#!/usr/bin/perl

# create names lookup table from first file
my %names;
while (<>) {
    (my $col1)= split / /, $_;
    $names{$col1} = 1;
    last if eof;
}

# scan second file
while (<>) {
    print if /^(\S+).*/ && not $names{$1};
}

você pode consultar essa pergunta Compare dois arquivos com a primeira coluna e remova a linha duplicada do segundo arquivo no shell script . Eu não quero remover duplicatas, eu só quero imprimir aquelas que combinam com o conteúdo da coluna e deixar outras.

    
por user68365 03.06.2014 / 13:05

1 resposta

2

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.

    
por 03.06.2014 / 14:11

Tags