awk - correspondendo em 2 colunas para linhas diferentes

1

Dado este arquivo:

92157768877;Sof_deme_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;20/02/2015;1;0;0
92157768877;Sof_trav_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;20/02/2015;1;0;0

91231838895;Sof_deme_faible_Email_am;EMAIL;26/01/2015;1 0;0
91231838895;Sof_nais_faible_Email_am;EMAIL;26/01/2015;1 0;0
91231838895;Sof_deme_Faible_Email_Relance_am;EMAIL;28/01/2015;1;0;0
91231838895;Sof_nais_faible_Email_Relance_am;EMAIL;28/01/2015;1;0;0
91231838895;Sof_deme_Faible_Email_Relance_am;EMAIL;30/01/2015;1;0;0

92100709652;Sof_voya_Faible_Email_am_%yyyy%%mm%%dd%;EMAIL;11/02/2015;1;0;0
92100709652 Sof_voya_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;11/02/2015;1;0;0
92100709652;Export Voya_Fort Postal;EXPORT;13/02/2015;1;0;0

92100709634;Export Voya_Fort Postal;EXPORT;15/02/2015;1;0;0
92100709634;Export Voya_Fort Postal;EXPORT;15/02/2015;1;0;0
92100709635;Deme_Voya_Fort Postal;EXPORT;16/02/2015;1;0;0

Eu quero pegar as linhas que preenchem as seguintes condições:

  • O primeiro campo é o mesmo que o primeiro campo da linha seguinte
  • O quarto campo é o mesmo que o quarto campo da próxima linha
  • as linhas restantes correspondem ao primeiro campo do primeiro campo da primeira linha.

Para que a saída seja assim:

92157768877;Sof_deme_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;20/02/2015;1;0;0
92157768877;Sof_trav_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;20/02/2015;1;0;0
91231838895;Sof_deme_faible_Email_am;EMAIL;26/01/2015;1 0;0
91231838895;Sof_nais_faible_Email_am;EMAIL;26/01/2015;1 0;0
91231838895;Sof_deme_Faible_Email_Relance_am;EMAIL;28/01/2015;1;0;0
91231838895;Sof_nais_faible_Email_Relance_am;EMAIL;28/01/2015;1;0;0
91231838895;Sof_deme_Faible_Email_Relance_am;EMAIL;30/01/2015;1;0;0
92100709652;Sof_voya_Faible_Email_am_%yyyy%%mm%%dd%;EMAIL;11/02/2015;1;0;0
92100709652 Sof_voya_Fort_Email_am_%yyyy%%mm%%dd%;EMAIL;11/02/2015;1;0;0
92100709652;Export Voya_Fort Postal;EXPORT;13/02/2015;1;0;0

Eu tentei com a solução awk abaixo, mas algo está errado. Eu não posso adicionar a quarta condição de campo. E como devo selecionar as linhas subseqüentes?

awk -F";" 'FNR==NR{a[$1]++; next} && FNR==NR{a[$4]++; next} a[$1]==2  a[$4]==2' filetestv2.txt filetestv2.txt
    
por Andy K 12.03.2015 / 14:30

1 resposta

4

Com base em uma discussão, tivemos no bate-papo , o que você quer é para imprimir todas as linhas cujos 1º e 4º campos são iguais aos 1º e 4º campos de outra linha. Se sim, você pode fazer:

awk -F';' '{ 
                if(NR==1){n=0; a[n]=$0}
                if($1==l1 && $4==l4){a[++n]=$0}
                else{
                    for (l in a){print a[l];}
                      delete a
                    } 
                    l1=$1; l4=$4; l=$0
                }
                END{if($1==l1 && $4==l4){print}
          }' file

Ou, em Perl:

perl -F';' -ane '$k{$F[0]}{$F[3]}.=$_; 
                 $l{$F[0]}{$F[3]}++;
                 END{
                    foreach $o (keys(%k)){
                        foreach $f (keys(%{$k{$o}})){ 
                          print "$k{$o}{$f}" if $l{$o}{$f}>1
                        }
                    }
                }' file
    
por 13.03.2015 / 16:44