#1 Le 15/11/2017, à 02:01
- caro44
[Résolu] Extraction de données entre deux fichiers
Bonsoir
J'ai mon fichier "base" (un extrait...)
TABL;LISTAB
"TAB1";"principale";"REF";" ";" ";"Modif mat"
"REF";"Modif";"15000001";"78607718";" ";" "
"REF";"Modif";"19800531";"78607719";" ";" "
"REF";"Modif";"44520478";"78607720";" ";" "
"REF";"Modif";"44890198";"78607721";" ";" "
"REF";"Modif";"44940171";"78607723";" ";" "
"REF";"Modif";"47450174";"78607724";" ";" "
et mon fichier "exploit" (un extrait...)
10|743|7718|DUPONT|JEROME|02021986|X|10|01022018|31122100|
20|743|7718|01022018|39,10|
40|743|7718|05|01012018|BI|54|11|
10|743|7719|ANDRE MARTIN|YAM BANE|11071956|R|10|010212018|31122100|
20|743|7719|01022018|35,10|
40|743|7719|07|01012018|BA|79|13|
10|743|7721|BUFFLE|MARJORIE|23111969|X|10|01022018|31122100|
20|743|7721|01022018|39,00|
40|743|7721|06|08102017|BA|54|11|
40|743|7721|06|08012018|BA|54|11|
10|743|7723|LAMP|JEAN-JACQUES|19051968|X|10|01022018|31122100|
20|743|7723|01022018|39,00|
40|743|7723|06|08012018|BI|51|16|
100|10|682|
Comme correspondance entre les deux fichiers, on a l'identifiant de la quatrième colonne de "base" avec la troisième colonne d'"exploit" [5 derniers caractères moins le 0] )
Le awk suivant m'affiche l'identifiant du user qui a plus d'une ligne commencant par 40 : en l'occurrence 78607721
awk -F ';|";"|[|]' '/REF/ {t[x=substr($4, 4)+0]=1; t1[x]=$4} /^40[|]/ && t[$3] {t3[$3]++} END {for (n in t3)if(t3[n]>1)print t1[n]}' base exploit
78607721
Je dois afficher (à l'ecran et ds un fichier log) en plus de cet identifiant, le nom et prenom (donc ici : BUFFLE Marjorie) et les lignes en question (donc ici :
40|743|7721|06|08102017|BA|54|11|
40|743|7721|06|08012018|BA|54|11| )
Pour résumer :
Matricule : <champ "matricule"> - Nom et Prénom : <champ "nom prénom">
copie des lignes 40
Pourriez-vous m'aider svp ?
Merci
Dernière modification par caro44 (Le 15/11/2017, à 09:34)
Hors ligne
#2 Le 15/11/2017, à 07:45
- pingouinux
Re : [Résolu] Extraction de données entre deux fichiers
Bonjour,
Tu peux essayer cette commande (une adaptation de la tienne) :
awk -F ';|";"|[|]' '
/REF/ {t[x=substr($4, 4)+0]=1; t1[x]=$4}
/^10[|]/ && t[$3] {nom[$3]=sprintf("%s %s",$4,$5)}
/^40[|]/ && t[$3] {t3[$3]++; lig40[$3]=lig40[$3] $0 ORS}
END { for (n in t3) if(t3[n]>1)
printf("Matricule : %s - Nom et Prénom : %s\n%s",t1[n],nom[n],lig40[n])
}
' base exploit
qui donne ce résultat avec ton exemple :
Matricule : 78607721 - Nom et Prénom : BUFFLE MARJORIE
40|743|7721|06|08102017|BA|54|11|
40|743|7721|06|08012018|BA|54|11|
Édité : Simplification
Édité (2) : Encore plus simple
awk -F ';|";"|[|]' '
/REF/ {matric[substr($4, 4)+0]=$4}
/^10[|]/ {nom[$3]=sprintf("%s %s",$4,$5)}
/^40[|]/ {nb40[$3]++; lig40[$3]=lig40[$3] $0 ORS}
END { for (n in nb40) if(nb40[n]>1 && matric[n])
printf("Matricule : %s - Nom et Prénom : %s\n%s",matric[n],nom[n],lig40[n])
}
' base exploit
Dernière modification par pingouinux (Le 15/11/2017, à 08:55)
Hors ligne
#3 Le 15/11/2017, à 09:33
- caro44
Re : [Résolu] Extraction de données entre deux fichiers
Trop fort Pingouin, j'ai fait un premier test en "prod", ca a l'air de marcher!
Merci bcp, tu m'enlèves une sacrée epine du pied...j'ai plus qu'à comprendre ce que tu as fais
Hors ligne