[Scripting bash] Comparaison de fichiers/Recherche de matricule

Fermé
Coralie98 - 22 oct. 2017 à 11:20
 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


A voir également:

7 réponses

dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
22 oct. 2017 à 12:24
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";" ";" "
0
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 ?
0
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...!:)
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
Modifié le 23 oct. 2017 à 11:06
montrer les bonnes données
j'ai ajouté un "
"REF";"MODIF";"15000001";78600001";" ";" "
----^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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'
0
P.S: Je precise que ce sont des extraits de fichiers!
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
Modifié le 23 oct. 2017 à 12:53
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[|]/
0
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";" ";" "
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
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";" ";" "
-------------------------^
0
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
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
Modifié le 23 oct. 2017 à 14:27
[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
0
Super dub, t un chef!!
0
helios44 Messages postés 344 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 24 octobre 2017 17
24 oct. 2017 à 09:59
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
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
24 oct. 2017 à 10:23
tout est possible, montrer un exemple de données et du résultat attendu
0
helios44 Messages postés 344 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 24 octobre 2017 17
24 oct. 2017 à 10:29
Je ne l'ai pas sous la main mais dans ce cas précis de ligne 10 et 40, comment feriez vous pour renvoyer vers un fichier log les noms des matricules qui n'auraient pas ces 2 lignes? Je l'adapterais à mes données.

Merci
0
dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
Modifié le 24 oct. 2017 à 11:04
en inversant le recherche par !
! /^10[|]|^40[|]/ && t[$3] pas les lignes qui commencent par 10 ou 40
ou
/^10[|]|^40[|]/ && ! t[$3] lignes 10 ou 40 qui ne contiennent pas ...
0
helios44 Messages postés 344 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 24 octobre 2017 17
24 oct. 2017 à 11:05
Euh excuse moi mais comment tu intégrès ta boucle du coup à l'interieur ?
0
helios44 Messages postés 344 Date d'inscription lundi 28 mars 2005 Statut Membre Dernière intervention 24 octobre 2017 17 > dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025
Modifié le 24 oct. 2017 à 11:14
*
0