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 :

Répartition des données d'un fichier


Sujet :

Shell et commandes POSIX

  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 Répartition des données d'un fichier
    Bonjour

    J'ai un petit soucis avec mon code
    Je cherche à repartir les lignes de mon FichierA dans deux fichiers temporaires
    Si une ligne du fichierA est présente dans le fichierB, je la dépose dans le fichier temporaire TempA sinon je la dépose dans le fichier temporaire TempB

    Voici le code
    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
     
    while read ligne1
     
    do
     
      grep "$ligne1" $FichierB  2>/dev/null
     
     
              if [ $? -eq 0 ]
     
                  then
     
                  echo "${ligne1}" >> $TempA  
              else
     
                  echo "${ligne1}" >> $TempB  
              fi
     
    done < $FichierA
    J'ai fait un CAT sur le fichier temporaire TempA je reçois le bon résultat
    Par contre dans le fichier TempB je ne sort rien

    Merci d'avance

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Bonjour,

    Il est possible de passer par un grep directement s'il supporte l'option -f (shell-ksh-supprimer-lignes-fichier-base-fichier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -f FichierA FichierB >TempA
    grep -v -f FichierA FichierB >TempB
    Cordialement

  3. #3
    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 Répartition des données d'un fichier
    Merci mais mon OS ne possède pas le -f du grep

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Si tu peux le trier et que tes lignes sont unique dans chacun de tes fichiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sort fichierb fichierb fichiera | uniq -u >tempb
    sort tempb tempb fichiera | uniq -u >tempa
    Sinon, peux tu préciser ton OS et ton shell ?

    Cordialement

  5. #5
    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 : 34
    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
    Par défaut
    Bonjour.

    Une autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cat <(sort -u f1.txt) <(sort -u f2.txt) | sort | uniq -d > tempA.txt
    cat <(sort -u f1.txt) <(sort -u f2.txt) | sort | uniq -u > tempB.txt
    Démo :

    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
    idriss@ThinkPad-T420 ~ $ cat f1.txt 
    une ligne unique 1
    une ligne commune
    une seconde ligne unique 1
    une ligne unique 1
    une seconde ligne commune
    idriss@ThinkPad-T420 ~ $ cat f2.txt 
    une ligne unique 2
    une ligne commune
    une seconde ligne unique 2
    une ligne unique 2
    une seconde ligne commune
    idriss@ThinkPad-T420 ~ $ cat <(sort -u f1.txt) <(sort -u f2.txt) | sort | uniq -d > tempA.txt
    idriss@ThinkPad-T420 ~ $ cat tempA.txt 
    une ligne commune
    une seconde ligne commune
    idriss@ThinkPad-T420 ~ $ cat <(sort -u f1.txt) <(sort -u f2.txt) | sort | uniq -u > tempB.txt
    idriss@ThinkPad-T420 ~ $ cat tempB.txt 
    une ligne unique 1
    une ligne unique 2
    une seconde ligne unique 1
    une seconde ligne unique 2
    idriss@ThinkPad-T420 ~ $
    Cordialement,
    Idriss

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Je ne pense pas que le résultat du fichier TempB.txt soit bon.
    D'après l'énoncer du problème, il veut juste traiter le fichierA par rapport au fichierB.
    Enfin, moi c'est comme ça que je l'ai compris

    Cordialement.

  7. #7
    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 : 34
    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
    Par défaut
    Non c'est moi qui n'ait pas bien lu, mea culpa

    Du coup ma solution tombe à l'eau. On peux partir de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat <(sort -u f1.txt) <(sort -u f2.txt) | sort | uniq -d > tempA.txt
    Puis faire la différence avec f1.txt, cela donnera les lignes à mettre dans tempB.txt mais ça revient à faire la même chose que toi en plus verbeux

    Idriss

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Sauf que techniquement, ta méthode me parait mieux car moins couteuse en mémoire

    Cordialement.

  9. #9
    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 et merci pour vos réponses
    J'ai testé vos solutions mais je pense qu'on a pas les même versions bash

    Voilà ce que j'ai exécute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat <(sort -u Fichier_SourceN_1) <(sort -u Fichier_SourceN) | sort | uniq -d > A1_fichier_temp
    Voici mon Message d'erreur

    sortsort: : can't stat Fichier_SourceNcan't stat Fichier_SourceN_1: No such file or directory:
    No such file or directory


    Il y a un soucis avec la commande sort

  10. #10
    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 : 34
    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
    Par défaut
    Bonjour.

    Peux-tu nous indiquer ton shell ? Et l'OS également ? (Il faut prendre l'habitude de toujours préciser sur ce forum afin de faciliter les recherches pour ce type de problème).

    Si tu es en console :

    Si tu fait cela depuis un script, il faudra nous indiquer ton shebang (ligne qui est de la forme #!/bin/<shell>).

    Essayons également de déterminer d'où vient le problème en décomposant la commande.

    Que renvoie la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -u Fichier_SourceN_1
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort Fichier_SourceN_1 | uniq -d
    Sinon qu'en est-il de la proposition de disedorgue ? Elle est peut être plus portable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sort fichierb fichierb fichiera | uniq -u >tempb
    sort tempb tempb fichiera | uniq -u >tempa
    Si elle fonctionne, essayons quand même pour notre culture de voir ce qui pose problème avec l'autre solution.

    Cordialement,
    Idriss

  11. #11
    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
    En gros ma méthode marche aussi, mais c'est le 2e fichier temporaire TempB
    qui cause problème. Je n'arrive à l'ouvrir quand je fais un CAT

    cat: cannot open /var/tmp/TempB.tmp

  12. #12
    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 : 34
    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
    Par défaut
    Peux-tu répondre à toutes mes questions (dont certaines ont déjà été demandée par disedorgue auparavant) ?

    Sinon on nage dans le vide.


  13. #13
    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
    J'ai essayé cette méthode, ça marche finalement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     while read ligne2
    do
     grep "$ligne2" $Fichier_SourceN  2>/dev/null 1>/dev/null
     
      if [ $? -eq 0 ]
        then
          echo $ligne2 >> $A1_fichier_temp 
     
       else  
          	echo $ligne2 >> $B1_fichier_temp 
     
       fi
     done < $Fichier_SourceN_1
    Merci pour vos reponses

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Bonjour,
    si jamais le fichier $FichierA contient des caractères spéciaux, il vaut mieux utiliser la commande fgrep.
    Les commandes grep ont un flag -q qui permet de tester le status (et c'est plus rapide que le > /dev/null).
    J'adapterais donc ton code de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read ligne1 ; do
      if fgrep -q "${ligne1}" "${FichierB}"
      then echo "${ligne1}" >> "${TempA}"
      else echo "${ligne1}" >> "${TempB}"
      fi
    done < "${FichierA}"

    Citation Envoyé par Moi302 Voir le message
    J'ai fait un CAT sur le fichier temporaire TempA je reçois le bon résultat
    Par contre dans le fichier TempB je ne sort rien
    Si, à la fin, "${TempB}" n'existe pas, c'est que toutes les lignes sont allées dans "${TempA}".

    Comme tu ne montres pas le début du script, on ne voit pas si les fichiers temporaires sont créés, ni comment.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 29/09/2005, 10h19
  2. [XML] stocker des données dans un fichier XML
    Par R3iTt0R dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/05/2005, 16h51
  3. Réponses: 3
    Dernier message: 13/12/2004, 13h54
  4. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  5. Temps d'accès à des données dans un fichier
    Par TONIAPEL dans le forum Assembleur
    Réponses: 5
    Dernier message: 28/09/2003, 15h21

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