Signaler

[Scripting bash] Comparaison de fichiers/Recherche de matricule

Posez votre question Coralie98 - Dernière réponse le 8 nov. 2017 à 14:56 par Laura_F-
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


Utile
+0
plus moins
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";" ";" "
Donnez votre avis
Utile
+0
plus moins
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 ?
Donnez votre avis
Utile
+0
plus moins
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...!:)
Donnez votre avis
Utile
+0
plus moins
montrer les bonnes données
j'ai ajouté un "
"REF";"MODIF";"15000001";78600001";" ";" "
----^
Donnez votre avis
Utile
+0
plus moins
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'
Cora98- 23 oct. 2017 à 11:47
P.S: Je precise que ce sont des extraits de fichiers!
Répondre
dubcek 17140Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 9 novembre 2017 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[|]/
Répondre
Donnez votre avis
Utile
+0
plus moins
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 17140Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 9 novembre 2017 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";" ";" "
-------------------------^
Répondre
Cora98- 23 oct. 2017 à 14:16
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
Répondre
dubcek 17140Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 9 novembre 2017 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
Répondre
Cora98- 23 oct. 2017 à 17:52
Super dub, t un chef!!
Répondre
Donnez votre avis
Utile
+0
plus moins
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 17140Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 9 novembre 2017 Dernière intervention - 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
Répondre
Laura_F-- 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|
Répondre
dubcek 17140Messages postés lundi 15 janvier 2007Date d'inscription ContributeurStatut 9 novembre 2017 Dernière intervention - 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
Répondre
Laura_F-- 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!
Répondre
Cora98- 24 oct. 2017 à 17:07
Merci

<RESOLU> !!
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !