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 :

Test d'égalité et comparer les premiers caractères


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Test d'égalité et comparer les premiers caractères
    Bonjour,
    J'ai vraiment besoin d'un coup de main ça fait un moment que je galère su un script unix
    J'ai besoin de comparer 2 fichiers sachant que les fichiers n'ont pas le même nombre de ligne
    On retrouve les lignes de chaque fichier avec les 8 premiers caractères
    Si ils sont identiques alors on récupère la ligne du fichier 2 pour la mettre à la fin de la ligne du fichier 1.

    Voici mon 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
    20
    21
    22
    23
    24
    25
     
    exec 3<res4.csv
    exec 4<resONP_CONTRAT.csv
    rm Resfin.csv
    # Boucle de lecture
     
     
    read lig1 0<&3
    while true
    do
        read lig1 0<&3
        read lig2 0<&4
     
        # Si fin des 2 fichiers
        test -z "$lig1" -a -z "$lig2" && break
        # Traitement des 2 lignes lues
    #ci-dessous j'espère pourvoire comparer les 8 premiers caractères de chaque ligne
       if [echo ${lig1:0:8} = echo ${lig2:0:8}];
       then
            echo "$lig1" ";" "$lig2">>Resfin.csv ;
         else
         {
        echo "$lig1" ";;;" >>Resfin.csv
         }
    done

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Je t'invite à méditer la console suivante:

    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
    $ cat lig1
    12345678 trouloulou tsoin tsoin
    12345679 plop moj,egkjr
    12345680 deghlskrejglskrtjg
    12345681 rlt!hrehk,dfk
    $ cat lig2
    lskrtjh
    12345678 111111111111111111111
     
    mlkjermlgkj
    12345679 22222222222222222222222
     
    mlkerjsgmlsekrj
    12345680 3333333333333333333333
     
    mlesrjgmlsekrj
    12345681 44444444444444444444444
    $ awk '(NR==FNR){tab[substr($0,1,8)]=substr($0,9);next} {print $0tab[substr($0,1,8)]}' lig2 lig1
    12345678 trouloulou tsoin tsoin 111111111111111111111
    12345679 plop moj,egkjr 22222222222222222222222
    12345680 deghlskrejglskrtjg 3333333333333333333333
    12345681 rlt!hrehk,dfk 44444444444444444444444
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse mais je n'arrive pas à l'utiliser (j'ai du mal en awk ...)
    j'ai mes 2 fichiers : res4.csv resONP_CONTRAT.csv
    et j'y ai mis le script avec ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Stockage des fichiers dans des buffers
    exec 3<res4.csv
    sort resONP_CONTRAT.csv >> resONP_CONTRAT_Trie.csv
    rm resONP_CONTRAT.csv
    mv resONP_CONTRAT_Trie.csv resONP_CONTRAT.csv
    exec 4<resONP_CONTRAT.csv
    rm Resfin.csv
    # Boucle de lecture
    awk '(NR==FNR){tab[substr($0,1,8)]=substr($0,9);next} {print $0tab[substr($0,1,8)]}' res4.csv resONP_CONTRAT.csv
    Mais rien ne se passe pas d'erreur mais le résultat ne sort pas

    J'ai fait cet autre test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    exec 3<res4.csv
    sort resONP_CONTRAT.csv >> resONP_CONTRAT_Trie.csv
    rm resONP_CONTRAT.csv
    mv resONP_CONTRAT_Trie.csv resONP_CONTRAT.csv
    exec 4<resONP_CONTRAT.csv
    rm Resfin.csv
    # Boucle de lecture
    awk '(NR==FNR){tab[substr($0,1,8)]=substr($0,9);next} {print $0tab[substr($0,1,8)]}' $3 $4
    Ca mouline longtemps j(ai un fichier de 12000 ligne+ et un de 6000

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    1) Donne un vrai échantillon des fichiers existants et la sortie voulue correspondante.

    2) Pas la peine de tester pour 12000 lignes si ça ne marche pas avec 5.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Fichier 1 (contient tout le monde):
    ADCD;nom1;prénom1;blablablabla
    1234;nom2;prénom2;blablablabla
    AZER;nom3;prénom3;blablablabla
     
    Fichier 2 (contient uniquement une partie de la population du fichier 1 avec des colonnes différentes sauf la première qui est identifiant):
    1234;champ3;champblabla;champblablabla
     
    Résultat à avoir (tout le fichier 1 avec si trouvé identifiant dans fichier 2 mettre les colonnes à la fin des lignes du fichier 1) :
    ADCD;nom1;prénom1;blablablabla;;;
    1234;nom2;prénom2;blablablabla;champ3;champblabla;champblablabla
    AZER;nom3;prénom3;blablablabla;;;
    j'ai essayé avec awk et shell mais franchement ça coince. je ne suis pas un spécialiste non plus.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai continué à changer mon code mais il faut que je vérifie les valeurs car je n'ai pas trop testé.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # Stockage des fichiers dans des buffers
    exec 3<res4.csv
    #sort resONP_CONTRAT.csv >> resONP_CONTRAT_Trie.csv
    #rm resONP_CONTRAT.csv
    #mv resONP_CONTRAT_Trie.csv resONP_CONTRAT.csv
    exec 4<resONP_CONTRAT.csv
    rm Resfin.csv
    # Boucle de lecture
     
    read lig1 0<&3
    read lig2 0<&4
     
    #set cut4 = `echo $places | cut -c3-11`
    Matricule1=`echo $lig1 | cut -c0-8`
    Matricule2=`echo $lig2 | cut -c0-8`
    while true
    do
     
        # Si fin des 2 fichiers
        # Traitement des 2 lignes lues
        # Traitement des 2 lignes lues
        if [ "$Matricule1" == "$Matricule2" ]; then
        {
            read lig1 0<&3
            read lig2 0<&4
            echo "$lig1"  "$lig2"
            Matricule1=`echo $lig1 | cut -c0-8`
            Matricule2=`echo $lig2 | cut -c0-8`
            test -z "$lig1"  && break
        }
        else
        {
            read lig1 0<&3
            echo "$lig1" ";;;"
            Matricule1=`echo $lig1 | cut -c0-8`
            test -z "$lig1"  && break
        }
        fi
        # Si fin des 2 fichiers
      #  test -z "$lig1" -a -z "$lig2" && break
     
    done
    J'ai vraiment pas compris ta solution Flodelarab car tu sembles passer par un tableau mais je necomprends pas comment tu gères les 2 fichiers du coup.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Ah! Oui mais déjà les 8 permiers caractères sont les 9 premiers; et en plus les lignes ne sont pas reconnus par les premiers caractères puisque "1234;nom1" est différent de "1234;cham"


    En fait, ce que tu veux faire s'appelle une jointure et il existe une commande 'join' qui fait cela. Il faut cependant que tes fichiers soient triés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat lig3
    ADCD;nom1;prénom1;blablablabla 
    1234;nom2;prénom2;blablablabla 
    AZER;nom3;prénom3;blablablabla 
    $ cat lig4
    1234;champ3;champblabla;champblablabla
    $ sort lig3>lig5
    $ sort lig4>lig6
    $ join -t';' -a1 -e'NULL' -11 -21 lig5 lig6
    1234;nom2;prénom2;blablablabla ;champ3;champblabla;champblablabla
    ADCD;nom1;prénom1;blablablabla
    AZER;nom3;prénom3;blablablabla
    Je te laisse faire man join pour voir ce que fait chaque option.

    Si tu as vraiment besoin des ';' pour les enregistrements qui n'ont pas pu être appareillés, tu peux utiliser sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ join -t';' -a1 -e'NULL' -11 -21 lig5 lig6 | sed 's/$/;;;;;;/;:z;s/;//7;tz'
    1234;nom2;prénom2;blablablabla ;champ3;champblabla;champblablabla
    ADCD;nom1;prénom1;blablablabla ;;;
    AZER;nom3;prénom3;blablablabla ;;;


    Enfin, j'explique ce que je faisais avec awk.
    Par la condition (NR==FNR) et la commande next, la première accolade s'appliquait au premier fichier et la seconde au second fichier.
    Awk accepte n'importe quoi comme indice de tableau. Donc, j'utilisais les 8 premiers caractères des lignes des deux fichiers comme indice. Et les derniers à partir du 9ème dans le contenu du tableau.
    Ainsi, dans la seconde accolade, le script ajoutait à la suite du premier fichier la ligne du second fichier qui correspondait.
    Tu peux toujours faire ceci (même en prenant le champ $1 comme indice). Mais 'join' est fait pour.


    Bonne chance.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Si ça t'intéresse voilà la solution que l'on a trouvé.
    Cette fois c'est testé et correct.

    J'ai vu le join j'avoue qu'on y a a pas pensé mais je ne sais pas si on aurait pu faire pareil mais bon je ne suis pas du tout un pro awk.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    # Stockage des fichiers dans des buffers
    exec 3<res4.csv
    exec 4<resONP_CONTRATFull.csv
    # Boucle de lecture
    read lig1 0<&3
    read lig2 0<&4
    NbLignFichier=`wc -l test.csv | awk '{print $1}'`
    CompteurLigne=1
    #awk ' BEGIN { FS = ";" }
    #{
    #      print $1
     
    #}' res4.csv  >> MatRes4.csv
     
    #awk ' BEGIN { FS = ";" }
    #{
    #      print $1
     
    #}' resONP_CONTRAT.csv  >> MatResONP_CONTRAT.csv
     
    #set cut4 = `echo $places | cut -c3-11`
    Matricule1=`echo $lig1 | cut -c0-8`
    Matricule2=`echo $lig2 | cut -c0-8`
     
    while true
    do
     
        # Si fin des 2 fichiers
        # Traitement des 2 lignes lues
    #echo "Avant IF" "$Matricule1" "$Matricule2"
        if [ "$Matricule1" == "$Matricule2" ]; then
        {
            echo "$lig1"  "$lig2"
            read lig1 0<&3
            read lig2 0<&4
            Matricule1=`echo $lig1 | cut -c0-8`
            Matricule2=`echo $lig2 | cut -c0-8`
        }
        else
        {
            echo "$lig1" ";;;"
            read lig1 0<&3
            Matricule1=`echo $lig1 | cut -c0-8`
        }
        fi
        # Si fin des 2 fichiers
      #  test -z "$lig1" -a -z "$lig2" && break
     
    CompteurLigne=`expr $CompteurLigne + 1 `
     
    if [ "$CompteurLigne" ==  "$NbLignFichier" ]; then
        {
        exit
        }
    fi
    done
     
     
    VRAI EXEMPLE DE FICHIER SOURCE TRIES AU PREALABLE
    FICHIER 1 res4.csv:
    10025708;010DG20052;MOB. NAT. ATELIER AUBUSSON;1089;Techniciens d'art;T;2;Catégorie B;TITU1;Titulaire;.YBR416AuhFxw;.YTOcgFaHNI1Y;3000;Technicien d'artde classe supérieure;08;ACI01;Affecté;010DG20049;SC
    10025709;010DG20052;MOB. NAT. ATELIER AUBUSSON;1089;Techniciens d'art;T;2;Catégorie B;TITU1;Titulaire;.Yp5bGUfCNaz6;.YYFpaEfKFWog;3000;Technicien d'artde classe supérieure;09;ACI01;Affecté;010DG20049;SCN-
    10025710;010DG20052;MOB. NAT. ATELIER AUBUSSON;1089;Techniciens d'art;T;2;Catégorie B;TITU1;Titulaire;.Yf4.sZH4NdR.;.YXmAkQA3MjNQ;3002;Technicien d'artde classe exceptionnelle;08;ACI01;Affecté;010DG20049;SC
    10025711;010DG20052;MOB. NAT. ATELIER AUBUSSON;1089;Techniciens d'art;T;2;Catégorie B;TITU1;Titulaire;.YvtFRpsajRTo;.YyPAsAjPzH4M;3002;Technicien d'artde classe exceptionnelle;09;ACI01;Affecté;010DG20049;SCN-
    10025712;010DG20052;MOB. NAT. ATELIER AUBUSSON;1089;Techniciens d'art;T;2;Catégorie B;TITU1;Titulaire;.YsDx2u8yomN.;.YSjF7EO6UGIw;3002;Technicien d'artde classe exceptionnelle;08;ACI01;Affecté ;010DG20049;SC
    10025713;010DG10166;EP VERSAILLES;1088;Techniciens;T;2;Catégorie B;TITU1;Titulaire;.YYWnC61KgDLI;.YhTqD7J1.g;3004;Technicien09;ACI01;Affecté ;010DG10166;EP SAILLES
     
     
    FICHIER 2 resONP_CONTRATFull.csv
    10025709;01/12/1992;0109950;01;Contrat
    10025710;01/12/1990;0100;01;Contrat
    10025711;01/12/1912;010450;01;Contrat
    10025714;01/12/1992;0100;01;Contrat
    10025716;01/12/1992;0100;01;Contrat

    Au faite si tu es spécialiste awk,
    j 'ai un fichier SQL avec plein de select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from ONP_RF_ARMES;
    select * from ONP_RF_BAREME;
    select * from ONP_RF_BAREME_NOTATION;
    et je cherche à mettre le resultat de ces select dans des fichiers différents avec pour nom de fichier le nom de la table.csv
    Pour mettre le resultat de tout :
    /mysql -u ONPTRG -p ONPTRG <monfichier.sql > resultat.csv
    mais resultat.csv contient toutes les tables...

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jrdos Voir le message
    Au faite si tu es spécialiste awk,
    j 'ai un fichier SQL avec plein de select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from ONP_RF_ARMES;
    select * from ONP_RF_BAREME;
    select * from ONP_RF_BAREME_NOTATION;
    et je cherche à mettre le resultat de ces select dans des fichiers différents avec pour nom de fichier le nom de la table.csv
    Pour mettre le resultat de tout :
    /mysql -u ONPTRG -p ONPTRG <monfichier.sql > resultat.csv
    mais resultat.csv contient toutes les tables...
    Salut
    Te faut analyser chaque ligne pour extraire le nom de la table; puis ensuite exécuter la ligne en redirigeant le résultat vers un fichier du nom de la table.

    Un truc comme ça
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    cat fichier |while read ligne
    do
        table=$(echo $ligne |awk '{for (i=1; i <= NF; i++) { if ($i == "from") break;} print $(i+1)}')
        echo "$ligne" | mysql -u ONPTRG -p ONPTRG >"$table.csv"
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Super merci, j'ai arrangé un peu, pour le mot de passe de la base

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

Discussions similaires

  1. Supprimer les premiers caractères d'une chaîne
    Par supers dans le forum Word
    Réponses: 4
    Dernier message: 21/08/2009, 10h04
  2. Afficher les premiers caractères d'une chaîne
    Par ZIED dans le forum Langage
    Réponses: 2
    Dernier message: 13/08/2009, 23h36
  3. Réponses: 3
    Dernier message: 13/02/2009, 15h49
  4. [XML] Afficher les premiers caractères d'un flux RSS
    Par metatron dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/01/2008, 18h40
  5. Réponses: 5
    Dernier message: 20/02/2007, 17h16

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