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

Linux Discussion :

trier 2 listes de noms


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut trier 2 listes de noms
    Bonjour,

    J'ai un problème de tri sur un fichier, un tableur excell (que j'ouvre avec OpenOffice)

    En effet, il se trouve dans ce fichier 2 colonnes contenant chacune un certain nombre de nom

    Certaines nomss sont présents dans les 2 colonnes, d'autres sont uniquement présents dans l'une ou l'autre colonne.

    Il me faut trier ces 2 colonnes.

    Le premier résultat doit être les noms communs aux 2 colonnes.
    Le second doit être les noms uniquement présents dans la 1ère colonne.
    Le dernier doit être les noms uniquement présents dans la 2ème colonne.

    Aussi, je sélectionne toute la colonne pour mettre tout au même format par défaut, puis met tout les noms en majuscule.

    Puis, je copie la 1ère colonne du fichier excell et la colle dans 1 fichier KWrite (nommé H) Puis fait la même chose avec la 2ème colonne dans un 2ème fichier KWrite (nommé C). KWrite est un utilitaire genre notepad sous le bureau Linux KDE.

    J'utilise alors la commande sort pour trier les noms par ordre alphabétique pour le fichier H, puis C

    ex : sort -o H1 H
    mv H1 H

    Puis la commande uniq :

    ex : uniq H > H1
    mv H1 H

    Puis utilise des scripts (que je ne comprends pas bien) pour faire les différents tris.

    -Noms communs aux 2 colonnes :

    script appelé fusion :
    -----------------------------------

    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
    #! /bin/bash -x
     
    fic_serveur1="/home/kaleo/Bureau/TEST/H"
    fic_serveur2="/home/kaleo/Bureau/TEST/C"
    fictmp=/tmp/fichier
    commun1="/home/kaleo/Bureau/TEST/commun"
     
    #for m in `cat $fic_serveur1`
     
    # do
    # grep $m $fic_serveur2 >> $commun1
     
    # done
     
     
    awk '{ printf("^%s$\n", $1) }' $fic_serveur1 > $fictmp
     
    {
    grep -f $fictmp $fic_serveur2 > $commun1
    # noms communs aux 2 colonnes écritent dans le fichier commun
    } 2>commun.log
     
    rm $fictmp
    ---------------------------

    - Noms uniquement présents dans la colonne H du fichier excell, c'est à dire dans le fichier H

    script appelé machine_unique_H

    -------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #! /bin/bash -x
     
    fic_serveur1="/home/kaleo/Bureau/TEST/H"
    fic_serveur2="/home/kaleo/Bureau/TEST/C"
    fictmp=/tmp/fichier
    commun1="/home/kaleo/Bureau/TEST/unique_H"
     
    awk '{ printf("^%s$\n", $1) }' $fic_serveur2 > $fictmp
     
    {
    grep -v -f $fictmp $fic_serveur1 > $commun1
    } 2>commun.log
     
    rm $fictmp
    ---------------------------

    - Noms uniquement présents dans la colonne C du fichier excell, c'est à dire dans le fichier C

    script appelé machine_unique_C
    -------------------------

    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
    #! /bin/bash -x
     
    fic_serveur1="/home/kaleo/Bureau/TEST/C"
    fic_serveur2="/home/kaleo/Bureau/TEST/H"
    fictmp=/tmp/fichier
    commun1="/home/kaleo/Bureau/TEST/unique_C"
     
    awk '{ printf("^%s$\n", $1) }' $fic_serveur2 > $fictmp # prend que la chaine (%s=string) #comprise entre début de ligne (^) et la fin de ligne
    # ($), le \n est égale à retour chariot, la chaine est entre "", le $1 = au 1er argument, printf #affiche la chaine entre ()
    # les {} = l'ensemble des commandes awk comprises entre ''
     
    {
    grep -v -f $fictmp $fic_serveur1 > $commun1
    } 2>commun.log
     
    rm $fictmp
    -----------------

    Hélas la commande wc -l appliquée aux différents fichiers : H, C, commun, unique_C, unique_H ne renvoit pas un résultat cohérent.

    ex : wc -l H

    La somme de commun(185)+unique_H(80) est différente des 266 noms présents dans H.

    266 H
    285 C
    80 unique_H
    99 unique_C
    185 commun

    De même il manque 1 nom dans la somme commun+unique_C.

    Après recherche manuelle je trouve un nom présent dans le fichier H et absent dans le fichier unique_H

    De même je trouve un nom présent dans le fichier C (ZORRO) et absent dans le fichier unique_C

    La commande diff qui compare le fichier C au fichier H :

    diff C H > DIFFERENCE

    montre à travers la lecture du fichier DIFFERENCE que le nom ZORRO n'apparait pas comme nom unique dans le fichier C
    La réecriture du nom (ZORRO) sous VI dans le fichier C ne change hélas rien

    Est ce une erreur de manipulation de ma part ?

    Le script appelé fusion semble bon, par contre je doute des scripts :

    machine_unique_C
    machine_unique_H

    Merci d'avance pour votre patience (et bonne année ;0)

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    Peut être qu'il est préférable de me proposer un (ou des) scripts dont on est sur de sa bonne marche et que je le(s) test(s) sur ces 2 colonnes à trier ?

    L'idéal serait un (ou des) script(s) (en bash si possible) simple(s) à comprendre pour moi .

    J'ai tenté ceci mais je n'arrive pas à le faire fonctionner :

    ----------------------------

    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
    24
    25
    #! /bin/bash -x
     
    fic_serveur1="/home/kaleo/Bureau/TEST/H"
    fic_serveur2="/home/kaleo/Bureau/TEST/C"
    #fictmp=/tmp/fichier
    commun1="/home/kaleo/Bureau/TEST/unique_H"
     
    cat $fic_serveur2 | while read NomMachine
     
    do 
    	RETVAL=0
    	test=`echo $NomMachine`
     
    #awk '{ printf("^%s$\n", $1) }' $fic_serveur2 > $fictmp
     
    #{ 
    	grep $test $fic_serveur1 && RETVAL=1
    	echo $RETVAL
    	if [ $RETVAL -ne 1 ] ; then
    		grep $test $fic_serveur1 | awk '{ printf $1 }' >> $commun1
    	fi
    done < $fic_serveur2
    #} 2>commun.log 
     
    #rm $fictmp
    ----------------------------------

    Cela me renvoit les résultats suivants :

    + read NomMachine
    + RETVAL=0
    ++ echo ALBERT1
    + test=ALBERT1
    + grep ALBERT1 /home/kaleo/Bureau/TEST/H
    + echo 0
    0
    + '[' 0 -ne 1 ']'
    + grep ALBERT1 /home/kaleo/Bureau/TEST/H
    + awk '{ printf $1 }'
    + read NomMachine

    -------------------------------

    Je précise que certains noms se terminent par des chiffres (comme 1, 13, 113), d'autres n'ont pas de chiffres. Certains noms se répètent, mais la différence se manifeste au niveau des chiffres qui terminent ces noms (ANDRE1, ANDRE14 etc...)

  3. #3
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 390
    Par défaut
    Je ne comprends pas bien : tu utilises OpenOffice (éditeur : Sun Microsystems) ou Excel (éditeur : Microsoft) ?
    Les nombres à la suite des noms doivent-t-ils être pris en compte pour la comparaison ou ignorés ?
    Plutôt que de passer par KWrite, n'y a-t-il pas moyen de faire une macrocommande de SCalc (ou ooCalc, suivant les versions), sachant que le tri peut être réalisé par le tableur ?
    Bref, tout ceci me paraît un poil tortueux.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    J'utilise un fichier crée sous excel que j'ouvre avec calc d'OpenOffice.

    Les nombres à la suite des noms doivent être pris en compte pour la comparaison

    ex : ANDRE1 et ANDRE12 sont 2 noms différents.

    Il me semble que le tri peut être réalisé par un tableur.

    Mais je n'arrive pas à réaliser ce tri par script et cela me bloque...

    Je n'arrive pas à comprendre ce qui ne marche pas

  5. #5
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 390
    Par défaut
    Tu fais quoi pour trier ton fichier avec l'invite de commande ?
    Autrement dit, à quoi ressemble ton script actuel ?

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    Ceux sont ceux du premier message.

    J'ai essayé dans faire un différent pour voir si c'est un problème de rédaction dans les scripts de mon premier message.

    On voit cet essai dans mon second message, mais il ne marche pas.

    Peut être le mieux est de me poster un script dont on est sur de sa bonne marche. Pour voir le résultat.

    J'en viens à douter de tout ; est ce une mauvaise manipulation de ma part, ou un problème de script ?

Discussions similaires

  1. Trier une List contenant des noms et prénoms
    Par Jb_One73 dans le forum Général Java
    Réponses: 15
    Dernier message: 19/02/2015, 16h19
  2. Réponses: 3
    Dernier message: 27/01/2009, 19h17
  3. récupérer la liste des noms des champs d'une table
    Par la_didise dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 17h55
  4. Trier un list control
    Par Delian dans le forum MFC
    Réponses: 2
    Dernier message: 06/10/2004, 18h44
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 13h44

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