이 파일이 주어지면:
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 솔루션을 사용해 보았으나 문제가 발생했습니다. 네 번째 필드 조건을 추가할 수 없습니다. 후속 행을 어떻게 선택해야 합니까?
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