Menu

[Scripting bash] Comparaison de fichiers/Recherche de matricule

Coralie98 - 22 oct. 2017 à 11:20 - Dernière réponse :  Laura_F-
- 8 nov. 2017 à 14:56
Bonjour,

J'ai effectué un certain nombre de contrôles de fichiers via des scripts batchs.

Il y a un dernier contrôle sur lequel je bute.

Pour résumer, j'ai deux fichiers "base.bdd" et "exploit"

- Exemple de contenu dans le fichier "base.bdd" :
"REF;"MODIF";"15000001";78600001";" ";" "
"REF";"MODIF";"1980031";78600002";" ";" "
"REF";"MODIF";"4480078";78600003";" ";" "
"REF";"MODIF";"4480078";78600128";" ";" "


- Exemple de contenu dans le fichier "exploit" :

10|249|128|DUPONT|JEAN|03101961|
20|249|128|383929829|39,01|
40|249|128|362090909|49,00|
40|249|128|362090909|49,00|
80|58|128|41|
80|58|128|41|

1) Fichier base : en colonne 4 est indiqué le matricule
=> Je dois récupérer ce matricule sur les 5 derniers chiffres en otant les zéros. Par exemple, 78600001 deviendra 1 ! 78600128 deviendra 128 etc..

2) Fichier exploit : seules les lignes qui commencent par 10 et 40 nous intéressent.
Il faut que je verifie que ces lignes 10 et 40 existent bien pour les matricules tronqués du point1.
Soit : 10|249|<matricule tronqué>
40|249|<matricule tronqué>


Cela fait plusieurs jours que je bute, les bonnes idées sont bienvenues :-/
Merci


Afficher la suite 

Votre réponse

43 réponses

dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 22 oct. 2017 à 12:24
0
Merci
hello
essayer
$ awk -F ';|";|[|]' '/REF/ {t[substr($4, 4)+0]=1} /^10|^40/ && t[$3] {print $1 "|" $2 "|" $3}' base.bdd exploit
10|249|128
40|249|128
40|249|128

j'ai changé la ligne 1 de base.bdd
"REF;"MODIF";"15000001";78600001";" ";" "
par
"REF";"MODIF";"15000001";78600001";" ";" "
Commenter la réponse de dubcek
Coralie98 - 22 oct. 2017 à 21:09
0
Merci
Merci dub pour ta réponse,

Je n'ai pas compris ton :
""REF;"MODIF";"15000001";78600001";" ";" "
par
"REF";"MODIF";"15000001";78600001";" ";" "

Ce sont les deux memes lignes non ?
Commenter la réponse de Coralie98
0
Merci
Dub,

Pour info, qd je lance ta commande, seule une ligne apparait :
100|50|0
Par contre, qd je teste cet autre awk

awk -F'";"' 'NR==FNR{a[substr($4,6)]}NR!=FNR&&!b{FS="|";b=1;$0=$0}NR!=FNR&&/10|40/{if($3 in a)print}' base.bdd exploit


toutes les lignes 40 apparaissent + 2 lignes commencant par 100...

Pour rappel, le resultat attendu : ce sont les lignes 10 et 40

je m'y remets...!:)
Commenter la réponse de Cora98
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - Modifié par dubcek le 23/10/2017 à 11:06
0
Merci
montrer les bonnes données
j'ai ajouté un "
"REF";"MODIF";"15000001";78600001";" ";" "
----^
Commenter la réponse de dubcek
0
Merci
Fichier Exploit :

30|753|4194|01|13022017|PT||17240|
30|753|4199|01|04032016|DG||04000|
30|753|6001|01|04052013|EP||09090|
30|753|6002|01|01122015|IR||14230|
40|753|7000|BALASK|DOMINIQUE|22111957|L|40|04012018|31122400|
20|753|7000|04012018|39,00|
30|753|7000|03|04012018|GA|11|40|
40|753|7000|04012018|34012018|
41|753|7000|216|02012018|M|34012018|S||||P||04012018|D||
42|753|7000|216|02012018|7,48|
42|753|7000|216|03012018|7,48|
42|753|7000|216|26012018|7,48|
42|753|7000|216|29012018|7,48|
42|753|7000|216|30012018|7,48|
42|753|7000|216|34012018|7,48|
40|753|7001|LANTI|STEPHANE|29121956|R|40|04012018|31122400|
20|753|7001|04012018|0,00|


Fichier base.bdd:

TABL;LISTAB;ETAB1;ETAB2;ETAB3;LIBELLE
"*TA";"principale";"DOSS";" ";" ";"Modif mat"
"REF";"Modif";"15000001";"78600001";" ";" "
"REF";"Modif";"19800531";"78600002";" ";" "
"REF";"Modif";"44800478";"78600003";" ";" "
"REF";"Modif";"44800178";"78600128";" ";" "

Si besoin, j'ai envoyé ce dernier fichier (base.bdd) vers un autre fichier de travail au sein duquel seule ma 4ème colonne apparait de façon triée.

Merci Dub'
P.S: Je precise que ce sont des extraits de fichiers!
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 23 oct. 2017 à 12:22
dans le fichier exploit, je ne vois aucune ligne 10 ou 40 qui contient un champ 3 égal à la fin du champ 4 de base.bdd (1, 2, 3 ou 128)

si des lignes commencent par 100 ou 400 et on ne veut que celles qui commencent par 10 ou 40, dans mon code, changer /^10|^40/ par /^10[|]|^40[|]/
Commenter la réponse de Cora98
0
Merci
En fait, comme le fichier exploit depasse les 2000 lignes, j'ai copié un extrait sur lequel effectivement il n'y avait pas de correspondance.

Je remets les deux extraits de fichiers avec une correspondance (128) (cf en caractère gras)

=> Malgré la modif de ton awk, rien ne ressort Dub :-/

Exploit :

40|753|4194|01|14022017|PT||17240|
40|753|4199|01|04032016|DG||04000|
40|753|6001|01|04052013|EP||09090|
40|753|6002|01|01122015|IR||14240|
10|753|7000|BALASK|DOMINIQUE|22111957|L|40|04012018|31122400|
20|753|7000|04012018|39,00|
40|753|7000|03|04012018|GA|11|40|
40|753|7000|04012018|34012018|
41|753|7000|216|02012018|M|34012018|S||||P||04012018|D||
42|753|7000|216|02012018|7,48|
42|753|7000|216|04012018|7,48|
42|753|7000|216|26012018|7,48|
42|753|7000|216|29012018|7,48|
42|753|7000|216|40012018|7,48|
42|753|7000|216|34012018|7,48|
10|753|7001|LANTI|STEPHANE|29121956|R|40|04012018|31122400|
20|753|7001|04012018|0,00|
10|753|128|DURAND|ERIC|01041964|R|10|01012018|31122100|
40|753|95|01|14022017|PT||17400|
40|753|100|01|01052016|RD||07610|
40|753|120|01|01012011|CV||02000|
40|753|7136|01|01122009|RD||08240|
40|753|128|02|01122015|IR||14000|


base. bdd :

TABL;LISTAB;ETAB1;ETAB2;ETAB3;LIBELLE
"*TA";"principale";"DOSS";" ";" ";"Modif mat"
"REF";"Modif";"15000001";"78600001";" ";" "
"REF";"Modif";"19800531";"78600002";" ";" "
"REF";"Modif";"44520478";"78600003";" ";" "
"REF";"Modif";"44890198";"78600100";" ";" "
"REF";"Modif";"44940171";"78607136";" ";" "
"REF";"Modif";"47450174";"78600128";" ";" "
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 23 oct. 2017 à 13:58
problème de "
$ awk -F ';|";"|[|]' '/REF/ {t[substr($4, 4)+0]=1} /^10[|]|^40[|]/ && t[$3] {print $1 "|" $2 "|" $3}' base.bdd exploit
10|753|128
40|753|100
40|753|7136
40|753|128

base.bdd du post 1
"REF";"MODIF";"4480078";78600128";" ";" "

du dernier post
"REF";"Modif";"47450174";"78600128";" ";" "
-------------------------^
Super Dubounet, ca marche! trop fort, tu m'enleves une sacrée épine du pied!

Juste une toute derniere explication, peux tu m'indiquer que signifie le ",4)+0]=1" de [substr($4, 4)+0]=1}.

Le premier 4 signifie le 4ème champ de bdd mais je ne comprend pas la suite..
Sur le net, j'ai vu que le deuxième 4 correspondait à "la taille" ???

Merci encore
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 23 oct. 2017 à 14:25
[substr($4, 4)+0 du champ 4, on extrait du 4ème caractère au dernier, 3ème paramètre de substr absent, paramètre qui spécifie la longueur de ce qu'on veut garder
donc de 78600128 on extrait la chaine 00128
+0 convertit la chaine en numérique, donc 00128 devient 128
Commenter la réponse de Cora98
helios44 348 Messages postés lundi 28 mars 2005Date d'inscription 24 octobre 2017 Dernière intervention - 24 oct. 2017 à 09:59
0
Merci
Très intéressant! ca me rappelle un ancien projet pour lequel j'avais du passer par des fichiers intermédiaires pour ressortir le log d'erreur.
Est ce qu'il est possible d'intégrer facilement dans votre awk, la boucle qui permettrait d'afficher les éléments en erreur (ceux qui n'ont pas d'article 10 et 40 dans votre cas) vers un fichier externe ?

Merci
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention > Laura_F- - 8 nov. 2017 à 13:12
affiche les lignes du fichier base.bdd dont le matricule est dans plus d'une ligne qui commence par 40 du fichier exploit
essayer
$ awk -F ';|";"|[|]' '/REF/ {t[x=substr($4, 4)+0]=1; t1[x]=$0} /^40[|]/ && t[$3] {t3[$3]++} END {for (n in t3)if(t3[n]>1)print t1[n]}' base.bdd exploit
Laura_F- > dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 8 nov. 2017 à 14:25
En fait, il affiche la ligne entière du fichier base.bdd
"REF";"Modif";"44940171";"78607136";" ";" " 


Il n'est pas possible de lui coller dans son print un "$4" afin de renvoyer la 4ème colonne uniquement, soit le matricule ?

Pour faire ce test, j'ai ajouté une ligne 40 à 78607136 dans le fichier exploit :


40|753|4194|01|14022017|PT||17240|
40|753|4199|01|04032016|DG||04000|
40|753|6001|01|04052013|EP||09090|
40|753|6002|01|01122015|IR||14240|
10|753|7000|BALASK|DOMINIQUE|22111957|L|40|04012018|31122400|
20|753|7000|04012018|39,00|
40|753|7000|03|04012018|GA|11|40|
40|753|7000|04012018|34012018|
41|753|7000|216|02012018|M|34012018|S||||P||04012018|D||
42|753|7000|216|02012018|7,48|
42|753|7000|216|04012018|7,48|
42|753|7000|216|26012018|7,48|
42|753|7000|216|29012018|7,48|
42|753|7000|216|40012018|7,48|
42|753|7000|216|34012018|7,48|
10|753|7001|LANTI|STEPHANE|29121956|R|40|04012018|31122400|
20|753|7001|04012018|0,00|
10|753|128|DURAND|ERIC|01041964|R|10|01012018|31122100|
40|753|95|01|14022017|PT||17400|
40|753|100|01|01052016|RD||07610|
40|753|120|01|01012011|CV||02000|
40|753|7136|01|01122009|RD||08240|
40|753|7136|01|01111709|RD||08240|
40|753|128|02|01122015|IR||14000|
dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention > Laura_F- - 8 nov. 2017 à 14:49
$ 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.bdd exploit
78607136
Laura_F- > dubcek 17433 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 20 juillet 2018 Dernière intervention - 8 nov. 2017 à 14:56
ah oui effectivement, j'avais modifié le print mais c'est le t1[x] sur lequel il fallait agir, suis bête!!

Merci Dubcek pour cette démonstration!
Commenter la réponse de helios44