awk - 匹配不同行的两列

awk - 匹配不同行的两列

给定这个文件:

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

我想要获得满足以下条件的行:

  • 第一个字段与下一行的第一个字段相同
  • 第 4 个字段与下一行的第 4 个字段相同
  • 其余行与其第 1 个字段与第 1 行的第 1 个字段相匹配。

所以输出是这样的:

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

我尝试使用下面的 awk 解决方案,但出现了问题。我无法添加第四个字段条件。我应该如何选择后续行?

awk -F";" 'FNR==NR{a[$1]++; next} && FNR==NR{a[$4]++; next} a[$1]==2  a[$4]==2' filetestv2.txt filetestv2.txt

答案1

根据我们的讨论在聊天中,您想要的是打印第一个和第四个字段与另一行的第一个和第四个字段相同的所有行。如果是这样,您可以这样做:

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

或者,在 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

相关内容