
このファイルが与えられたら:
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の最初のフィールドと一致させます。
したがって、出力は次のようになります。
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ソリューションを試しましたが、問題が発生しました。 4番目のフィールド条件を追加できません。後続の行をどのように選択する必要がありますか?
awk -F";" 'FNR==NR{a[$1]++; next} && FNR==NR{a[$4]++; next} a[$1]==2 a[$4]==2' filetestv2.txt filetestv2.txt
答え1
私たちの議論に基づいてチャット中、必要なのは、最初のフィールドと4番目のフィールドが他の行の最初と4番目のフィールドと同じすべての行を印刷することです。その場合は、次のようにできます。
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