Esta versão perl espera entrada em stdin ou de nomes de arquivos especificados na linha de comando e imprime resultados para stdout.
Ele usa um hash para rastrear quantas vezes viu os mesmos valores juntos (ignorando as linhas subseqüentes, a menos que estejam em ordem inversa à primeira). Duas vezes significa que a relação entre a coluna A e a coluna B é bidirecional A < - > B, enquanto que uma vez significa unidirecional de A- > B.
Os hashes são inerentemente não-ordenados, então podemos usar a seguinte matriz para preservar a ordem das linhas de entrada e imprimir os resultados em uma ordem similar (não será exatamente a mesma porque só imprimimos AB mesmo se BA também foi vista )
Se a ordem da saída não for importante, comente ou exclua a linha my @order
e a linha push
e troque o caractere de comentário nas duas versões das linhas foreach
abaixo.
#! /usr/bin/perl
use strict;
# hash keys will be 'columnA-columnB', we'll split them when we print the report.
my %AB=();
my @order=();
while(<>) {
chomp;
my ($A, $B) = split;
# have we seen a key B-A? if so, increment that rather than define A-B
if (defined($AB{$B . '-' . $A})) {
$AB{$B . '-' . $A} = 2;
} elsif (! defined($AB{$A . '-' . $B})) {
$AB{$A . '-' . $B} = 1;
push @order, $A . '-' . $B;
}
}
#foreach my $key (sort keys %AB) {
foreach my $key (@order) {
my ($A,$B) = split /-/,$key;
if ($AB{$key} == 1) {
print "$A -> $B\n";
} elsif ($AB{$key} == 2) {
print "$A <-> $B\n";
} ;
}
Saída:
Mike <-> John
Pamela <-> Barbara
Mike -> Paul
Roger -> Paul