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 POSIX Discussion :

Vérifier la modification d'une ligne


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Par défaut Vérifier la modification d'une ligne
    Je dois comparer deux fichiers: FichierA et FichierB

    Dans un premier temps, je parcoure le fichierA
    Si une ligne du fichierA est absente dans le fichierB je la copie dans TempA.
    Ensuite Si une ligne du fichierA est présente dans le fichierB (mais partiellement,
    c'est à dire qu'elle est présente mais avec quelques différences par rapport au fichier de référence), je la copie dans TempB.
    Le but est de récupérer les lignes du FihcierA qui ont été modifiées par rapport au fichierB.

    Je me demande si cela est vraiment possible en Shell
    Le problème est que les lignes ne sont pas triées et elles n'ont pas de référence.

    Merci d'avance

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ mkdir /tmp/test
    $ cd /tmp/test
    $ echo titi >> A
    $ echo tutu >> A
    $ sed 's/u/z/' A > B
    $ # là tu as de quoi jouer et tester 
    $ diff A B | grep '>'  > diffAB
    $ cat diffAB
    > tztu
    $
    la difference a bien été extraite, je te laisse trouver comment la faire dans le bon sens et la mettre en forme.


    pour lire un fichier ligne à ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read
    do 
    #traitement sur la variable $REPLY
    done < fichier


    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
    $ cat A
    toto
    titi
    tutu
    $ cat B
    toto
    titi
    tztu
    $ while read                         
    > do                                 
    > grep $REPLY B || echo $REPLY > tmpA # premiere consigne si absent de B copier dans tmpA
    > done < A 
    toto
    titi
    $ cat tmpA
    tutu
    $
    tu vois le principe ?

  3. #3
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Moi302 Voir le message
    Ensuite Si une ligne du fichierA est présente dans le fichierB (mais partiellement, c'est à dire qu'elle est présente mais avec quelques différences par rapport au fichier de référence)
    Hmm, il faudrait définir plus clairement les différences acceptables ou pas.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ head *
    ==> A <==
    toto
    titi
    tutu
     
    ==> B <==
    toto
    titi
    tzutu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -v -f B A
    tutu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -v -f A B
    tzutu

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Par défaut
    Bonjour

    Avec ta méthode, il m'affiche les lignes qui ont été modifiées (c'est ce que je cherchais )

    Par contre il m'affiche également les lignes qui ne sont pas présentes dans le fichier de référence (FichierB). Ce qui revient à faire un DIFF entre les deux fichiers.

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while read                         
     do                                 
       grep "$REPLY" $FichierB
     
       if [ $? -ne 0 ]
         then 
            echo $REPLY >> $A1_fichier_temp 
       fi 
     
    done < $FichieA

    En gros je n'ai pas besoin de récupérer les lignes qui ne sont pas présentes dans le fichier de référence

    Merci d'avance

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut +1 pour jlliagre
    Comment faire la diference entre une ligne absente et une ligne modifiée ... ?

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Par défaut
    Si la ligne est modifiée, c'est qu'elle est présente dans le fichier de référence
    mais avec quelques différences (par exemple un caractère ou un mot manquant)

    Si elle est absent dans le fichier de référence, c'est qu'elle n'est pas présente et qu'elle n'est identique à aucune ligne.

    Exemple:

    FichierA
    toto
    tutu
    tata

    FichierB
    toto
    tuztu
    tata
    tete


    Fichier de Sortie
    tutu

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ head *
    ==> A <==
    toto
    tutu
    tata
     
    ==> B <==
    toto
    tuztu
    tata
    tete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -v -f B A
    tutu

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    bonjour,

    Dans l'exemple que tu donne, il suffit de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat FichierB FichierB fichierA | sort | uniq -u
    Cordialement.

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Billets dans le blog
    1
    Par défaut
    bien vu le double cat sur fichier B ...
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comm -23 fichierA FichierB
    edit: il faut peut etre trier d'abord les fichier comme avec diff

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Ouahh, quelqu'un se souvient de la commande comm , je l'utilise tellement plus que je viens de vérifié si elle existait encore sous linux


    Cordialement.

  12. #12
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 42
    Par défaut
    Merci pour vos réponses

    @Zipe31
    Je veux bien tester ta proposition mais ma version bash n'accepte pas le l'option -f du grep

    @Desedorgue
    J'ai testé ta proposition mais je n'extrais pas les bonnes lignes
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat $FichierA $FichierA $FichierB | sort | uniq -u
    Cordialement

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    J'ai doublé le fichier B pas le A.

    Cordialement.

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par Moi302 Voir le message
    @Zipe31
    Je veux bien tester ta proposition mais ma version bash n'accepte pas le l'option -f du grep
    C'est bizarre
    Sous quel système es-tu ?
    Quelle version de grep ?

    C'est bien dommage, parce que...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ head *
    ==> N <==
    toto vm
    tata pk
    tu 24 p
    tutu 24 x
    tutu 36 x
     
    ==> N-1 <==
    toto vm
    tata pk
    tutu 24 p
    tutu 24 x
    tutu 36 x
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -v -f N-1 N 
    tu 24 p

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

Discussions similaires

  1. Modification d'une ligne d'un datagridview via checkbox
    Par DiamonDonald dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/04/2008, 23h42
  2. date auto si modification d'une ligne ou colonne
    Par chris81 dans le forum Excel
    Réponses: 2
    Dernier message: 16/10/2007, 07h40
  3. Modification d'une ligne d'un fichier
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 20/03/2007, 15h29
  4. Réponses: 1
    Dernier message: 19/05/2006, 17h33
  5. Réponses: 3
    Dernier message: 03/04/2006, 10h42

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