IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comparer contenu de deux fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Comparer contenu de deux fichiers
    Bonjour,

    Je suis actuellement stagiaire dans une entreprise et il m'est demandé de réaliser un script shell (Ou alors python ou perl) qui réponde aux exigences suivantes :

    Je récupère un fichier à partir d'une URL.
    Ce fichier est au format JSON et je dois le parser pour récupérer uniquement les champs qui m'intéressent. ("Nom d'un module" et "Valeur du module")

    Je dois ensuite comparer la valeur, pour chaque module, à celle définie dans un autre fichier et remonter des erreurs à un logiciel de supervision si la valeur d'un module ne correspond pas à celle contenue dans le fichier de configuration.

    Ce que je sais faire actuellement, c'est la récupération du fichier JSON et la création d'un autre fichier contenant les informations qui m'intéressent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    wget --http-user=admin --http-password=admin 192.168.1.38/api/devices
     
    awk -F"[,:]" 
    '{
    	for(i=1;i<=NF;i++)
    	{
    		for(j=i;j<=NF;j++)
    		{
                            #Je recherche les champs "name" et "value" dans mon fichier
    			if($i~/name/ && $j~/value/)
    			{
    				print "{"$i":"$(i+1)","$j":"$(j+1)"}," > "fichier"
    			}
    		}
    	} 
    }' devices
    Le fichier devices ressemble à ça au départ :
    http://pastebin.com/pCACXgrs

    Et le fichier que je génère, nommé "fichier" dans le code, ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {"name":"Temp 1","value":"22.7"},
    {"name":"Humi 1","value":"65"},
    {"name":"6a porte principale","value":"1"},
    {"name":"6a porte arriere","value":"1"},
    {"name":"6b porte principale","value":"0"},
    {"name":"6b porte arriere","value":"1"},
    Etc ..
    J'ai même réussi à re-créer la structure d'un fichier JSON, en sortie, pour peut être mieux le manipuler par la suite.

    Quoiqu'il en soit, je ne vois pas comment réussir à comparer la valeur numérique de ce fichier à celui de configuration qui ressemblerait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {"name":"Temp 1","value_ref_min":"20","value_ref_max":"25"},
    {"name":"Humi 1","value_ref_min":"50","value_ref_max":"70"},
    {"name":"6a porte principale","value_ref_min":"0","value_ref_max":"0"},
    {"name":"6a porte arriere","value_ref_min":"0","value_ref_max":"0"},
    {"name":"6b porte principale","value_ref_min":"0","value_ref_max":"0"},
    {"name":"6b porte arriere","value_ref_min":"0","value_ref_max":"0"},
    Avez vous des idées ? Est-ce possible de manière simple ?


    Cordialement,

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    Soit tu parcours tes deux fichier de manière séquentielles et tu découpe chaque lignes avec bash/cut ou awk. Soit tu peux utiliser un langage shell plus évolués qui prennent automatiquement en charge le JSON sous forme de table de hachage (python, perl ou php ou d'autres).

    Exemple en PHP, la fonction json_decode : http://php.net/manual/fr/function.json-decode.php

    Cordialement,
    Idriss

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 262
    Points : 13 518
    Points
    13 518
    Par défaut
    Bonjour

    Si JSON est si bien que ça, utilise le

    Sinon, tu peux faire un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $ cat fourchettes.txt 
    {"name":"Temp 1","value_ref_min":"20","value_ref_max":"25"}, 
    {"name":"Humi 1","value_ref_min":"50","value_ref_max":"70"}, 
    {"name":"6a porte principale","value_ref_min":"0","value_ref_max":"0"}, 
    {"name":"6a porte arriere","value_ref_min":"0","value_ref_max":"0"}, 
    {"name":"6b porte principale","value_ref_min":"0","value_ref_max":"0"}, 
    {"name":"6b porte arriere","value_ref_min":"0","value_ref_max":"0"},
     
    $ cat challengers.txt 
    {"name":"Temp 1","value":"22.7"}, 
    {"name":"Humi 1","value":"65"}, 
    {"name":"6a porte principale","value":"1"}, 
    {"name":"6a porte arriere","value":"1"}, 
    {"name":"6b porte principale","value":"0"}, 
    {"name":"6b porte arriere","value":"1"},
    $ awk -F\" '(FNR==NR){min[$4]=$8;max[$4]=$12;next} (FNR!=NR){printf "%s égale %s entre %s et %s\n", $4, $8, min[$4], max[$4]}' fourchettes.txt challengers.txt 
    Temp 1 égale 22.7 entre 20 et 25
    Humi 1 égale 65 entre 50 et 70
    6a porte principale égale 1 entre 0 et 0
    6a porte arriere égale 1 entre 0 et 0
    6b porte principale égale 0 entre 0 et 0
    6b porte arriere égale 1 entre 0 et 0
    $
    Il ne te reste plus qu'à faire une condition pour savoir si le champ $8 est bien entre min et max.

    Bonne chance

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je vous remercie pour l'attention que vous portée à mon problème.
    Je vais me pencher sur la seconde solution et voir si je peux facilement la mettre en place.

    Je vous tiendrai au courant.

    EDIT :
    Cela fonctionne parfaitement. J'ai couplé ceci à un IF afin de comparer les valeurs.
    Ce sujet est donc résolu, je vous remercie.

    Il me reste plus qu'à envoyer un mail, ou déclencher une autre action au dépassement d'une valeur.

    Merci encore, forum réactif et réponses précises.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparer contenu de 2 fichiers
    Par Raikyn dans le forum Débuter
    Réponses: 14
    Dernier message: 10/03/2013, 22h27
  2. parser le contenu de deux fichiers XML
    Par getrude dans le forum XSL/XSLT/XPATH
    Réponses: 28
    Dernier message: 07/03/2012, 18h22
  3. Réponses: 0
    Dernier message: 14/11/2010, 15h22
  4. Comparer le contenu de deux fichiers
    Par Sancti_Eyes dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2009, 10h54
  5. comparer contenu de deux fichiers
    Par Earl7 dans le forum Langage
    Réponses: 5
    Dernier message: 02/02/2009, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo