Este em Perl parece estar funcionando.
perl -F, -alne '
next if /^\s*$/;
$hs{$F[2]}{"$F[0],$F[1]"}++;
END{
while (my ($nr, $lhs) = each %hs) {
while (my ($lts, $cnt) = each %{$lhs}) {
my $rvs = scalar reverse $lts;
my $rvsn = $hs{$nr}{$rvs} // 0;
print "$lts,$nr,$cnt,$rvs,$rvsn";
delete $hs{$nr}{$rvs};
}
}
}
' data
Explicação linha por linha:
-
Execute o Perl com ,
f ou delimitador, leia os campos em um a rray, cuide de l ine endings, execute para cada li n e e e xecute:
perl -F, -alne '
-
Ignorar linhas em branco na entrada:
next if /^\s*$/;
-
Aumenta o contador de hash de cada registro:
$hs{$F[2]}{"$F[0],$F[1]"}++;
-
Inicie o bloco final:
END{
-
Leia o hash:
while (my ($nr, $lhs) = each %hs) {
while (my ($lts, $cnt) = each %{$lhs}) {
-
Prepare dados para impressão:
my $rvs = scalar reverse $lts;
my $rvsn = $hs{$nr}{$rvs} // 0;
print "$lts,$nr,$cnt,$rvs,$rvsn";
-
Livre-se da entrada dupla no hash:
delete $hs{$nr}{$rvs};
-
data
é o arquivo de entrada.
Como resultado, para esses dados de entrada:
A,B,1999
C,D,1990
B,A,1989
D,A,1990
A,B,1999
B,A,1999
você deve obter esta saída:
D,A,1990,1,A,D,0
C,D,1990,1,D,C,0
B,A,1989,1,A,B,0
A,B,1999,2,B,A,1