Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#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

big_smile 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 smile

wink

Hors ligne