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 :

Shell comparaison niveau sup


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Par défaut Shell comparaison niveau sup
    Bonsoir à tous!

    Je développe un script de comparaison entre 2 fichiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FIC1:
    AZERTY,TOTO,TITI
     
    FIC2:
    AZERTY,TATA,POPO

    Il y a une erreur si le checksum des deux fichiers est différent:

    donc si le checksum est différent je lance un cmp entre les deux fichiers qui me donne la ligne et le caractère qui diffère:

    Je voudrais maintenant qu'il me renvoie via le cmp le caractère exacte qui est faux dans un fichier qui s’appelle AZERTY.txt ( donc le 1er mot du fichier)

    Voila mon script :
    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
    #variables
    FICHIER1=...
    FICHIER2=...
     
    #checksum du fichier1
    CK_F1=$(cksum ${FICHIER1} | awk '{print $1";"$2}'  )
    CK_F2=$(cksum ${FICHIER2}| awk '{print $1";"$2}' )
    #DIFF=diff $FICHIER1 $FICHIER2
     
    if [ "x$CK_F1" = "x$CK_F2" ]
     then
     echo "Les fichiers $FICHIER1 et $FICHIER2 sont identiques"
      else
      echo "Les fichiers $FICHIER1 et $FICHIER2 sont diffèrents"
     
     cmp $FICHIER1 $FICHIER2 
     
     
    fi

  2. #2
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Dans ce cas là, mieux vaut donner un exemple concret de ce que tu veux

    Ce que je comprends, c'est que tu veux avoir "A" dans un fichier AZERTY.txt, mais je ne suis pas sur que ça soit exactement cela ?

    Que fais-tu si tu as ceci comme fichier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FIC1:
    AZERTY,TOTO,TITI
     
    FIC2:
    QWERTY,TATA,POPO
    Est-ce que tu sous-entends que les fichiers sont composés de champs séparés par des virgules (par rapport au fait qu'il faille prendre le premier mot, et ça peut aussi simplifier le boulot) ?

    Avec cmp, tu peux utiliser l'option -b qui va t'afficher la ligne qui contient une différence ainsi que le caractère qui diffère... un petit coup de cut / awk / sed derrière et tu devrais pouvoir récupérer ce qui t'intéresse ?

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Pourquoi ajouter du flou et des traitements inutiles avec le calcul d'un checksum, à moins de faire la comparaison avec des signatures fournis lors d'un download par exemple....

    Une seule ligne obtiens le même résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp ${FICHIER1} ${FICHIER2} && echo "${FICHIER1} et ${FICHIER2} sont identiques"
    • si les fichiers sont identiques, cmp retourne 0, ce qui suis && est exécuté
    • si les fichiers sont différents, cmp retourne 1, t'affiche le problème, ce qui suis && n'est pas exécuté.
    • si l'un des fichiers est absent, cmp retourne >1, t'affiche le problème, ce qui suis && n'est pas executé.


    exemple
    Code ksh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cmp  strange.c strtok.c && echo "les fichiers sont identiques"
    strange.c strtok.c sont différents: octet 1, ligne 1
     
    $ cmp  strange.c strange.c && echo "les fichiers sont identiques"
    les fichiers sont identiques
     
    $cmp  strange.c unknown.c && echo "les fichier sont identiques"
    cmp: unknown.c: Aucun fichier ou répertoire de ce type

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Par défaut
    Je vous ré explique le problème:

    fic1.txt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AZERTY=AZERTY,QWERTY=QWERTY
    AZERTY=QWERTY,QWERTY=AZERTY
    fic2.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AZERTY=AZERTY,QWERTY=QWERTY
    AZERTY=QWERTY,QWYERTY=AZERTY
    Mon script actuel détecte que les deux fichiers sont diffèrent grâce au checksum.

    Dans mon script, si il y a différence j'ai pensé alors de lancé un " cmp fic1.txt fic2.txt" qui me renvoie cette ligne testé a la main:

    fic1 fic2 differ = char45, line2

    Voila, maintenant ma question c'est dans un premier temps:

    - Générer un rapport_erreur.txt avec :

    Les erreurs entre [ fichier1] et [ fichier2 ] sont [ différence ]

    les [...] ne sont bien sur pas à écrire en dur mais récolté les infos grâce au script précédent.

    J'espère que j'ai été clair...

  5. #5
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     $ cat test1.txt
    AZERTY=AZERTY,QWERTY=QWERTY
    AZERTY=QWERTY,QWERTY=AZERTY
    $ cat test2.txt
    AZERTY=AZERTY,QWERTY=QWERTY
    AZERTY=QWERTY,QWYERTY=AZERTY
    $ cmp -b test1.txt test2.txt
    test1.txt test2.txt differ: byte 45, line 2 is 105 E 131 Y

Discussions similaires

  1. Agragation appliquée uniquement au niveau sup
    Par Safaritn dans le forum SSAS
    Réponses: 7
    Dernier message: 20/10/2009, 13h12
  2. [ODBC] problème au niveau de la comparaison des login et mdp
    Par vanou dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/06/2007, 21h37
  3. aide sur les passerelles niveau sup à 3
    Par moha1984 dans le forum Développement
    Réponses: 5
    Dernier message: 09/01/2007, 11h07
  4. Comparaison de nombres flottants en shell
    Par the_ionic dans le forum Linux
    Réponses: 13
    Dernier message: 30/12/2006, 08h44
  5. Besoin d'aide au niveau de Shell
    Par Argael dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 01/08/2006, 11h04

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