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 :

Comparaison de valeurs communes dans des fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut Comparaison de valeurs communes dans des fichiers
    Bonjour,
    je travaille avec deux fichiers de données, le premier contient une colonne représentant des altitudes de "référence", dans mon deuxième fichier j'ai une colonne avec des altitudes, auxquelles sont attribuées des mesures dans une deuxième colonne :

    fichier 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    12.00100
    12.75100
    18.75100
    ...
    fichier 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    12.770 7.7966E+11 
    12.920 7.8995E+11 
    13.070 6.9965E+11 
    ...

    Ce que je veux faire est comparer la première colonne 1 du premier fichier avec celle du deuxième fichier, et si les valeurs sont similaires (les trois premiers chiffres suffisent), alors m'afficher les lignes correspondantes du deuxième fichier.

    J'essaye avec 'awk' mais ce n'est pas assez clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    fic2=ozone_lidar/ozone_1807022011.txt 
    fic1=trajectories/PartAlt.txt  
     
    awk 'NR==FNR{arr[$1];next} $1 in arr' $fic2 $fic1
    Auriez-vous une idée pour avancer ?
    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    qu'est-ce qui "n'est pas assez clair" ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Quelles sont les altitudes minimale et maximale ?

    NB: Tu as inversé fic1 et fic2. Pourquoi ?

  4. #4
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut
    Alors c'est surtout l'utilisation de 'awk' qui n'est pas super clair, j'ai trouvé cette commande est essayé des trucs pour mon cas mais ça ne fonctionne pas.


    Les altitudes minimales/maximales ne sont pas définies à l'avance pour les fichiers (je traite une série de 20 fichiers). A la limite je peux regarder ça pour chaque fichier, par exemple pour celui que je traite dans cette discussion c'est [12.247; 22.000] dans le fichier 1, et [10.070 ; 43.070] dans le fichier 2.


    Et sinon j'ai inversé les deux fichiers uniquement parce que je regardais si ça marchait mieux comme ça, mais toujours aucun résultat

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Pas testé, mais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^\([0-9]\+\.[0-9]\).*/^\1/' fic1 | grep -f - fic2
    Devrait le faire...

  6. #6
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut
    Oui je viens de tester ça, c'est parfait tout marche bien!

    Merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk 'NR==FNR{arr[int($1*10)/10]++;next} (int($1*10)/10) in arr' fichier{1,2}.txt
    12.770 7.7966E+11

  8. #8
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pas testé, mais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^\([0-9]\+\.[0-9]\).*/^\1/' fic1 | grep -f - fic2
    Devrait le faire...
    finalement ça avait marché pour certains cas :



    fichier 1 (référence):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    12.29900
    12.30000
    12.30100
    12.30200
    ...
    fichier 2 (à comparer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    11.720 1.8967E+12 
    11.870 1.9118E+12 
    12.020 1.9142E+12 
    12.170 1.7528E+12 
    12.320 1.3971E+12 
    ...
    fichier de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    12.320 1.3971E+12 
    12.920 7.8995E+11 
    13.070 6.9965E+11 
    13.220 6.2091E+11 
    13.370 7.1282E+11 
    ...

    Mais pas d'autres :

    fichier de référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    12.01100
    12.01200
    12.01900
    ...
    fichier à comparer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    10.070 5.3821E+11 
    10.220 4.7678E+11 
    10.370 4.4441E+11 
    10.520 4.5303E+11 
    10.670 5.1775E+11 
    10.820 5.9737E+11 
    10.970 6.3963E+11 
    11.120 6.6058E+11
    ...
    fichier de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    10.070 5.3821E+11 
    10.220 4.7678E+11 
    10.520 4.5303E+11 
    10.670 5.1775E+11 
    10.820 5.9737E+11 
    11.120 6.6058E+11 
    11.420 9.3533E+11 
    ...

    J'ai bien utilisé le code dans les deux cas, mais dans le cas où ça n'a pas marché j'ai l'impression que certaines valeurs sont bien triés (lignes 3 et 7 du fichier à comparer) et pas d'autres.

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Ici, le tri se fait sur la base des nombre xxx.x , donc si tu as par exemple 10.123 et 10.189 , ils seront pris tous les 2 car la recherche est 10.1

    Car tu as dit les 3 premiers chiffres.

    Si ce n'est pas ça, c'est peut-être le format du fichier (windows au lieu de linux/unix)

    La soluce de Flodelarab est plus pertinente si elle fonctionne, car elle compare bien des nombre et non des caractères

  10. #10
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk 'NR==FNR{arr[int($1*10)/10]++;next} (int($1*10)/10) in arr' fichier{1,2}.txt
    12.770 7.7966E+11
    Cette solution fonctionne bien pour l'instant! Je fais d'autres tests pour vérifier

  11. #11
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, le tri se fait sur la base des nombre xxx.x , donc si tu as par exemple 10.123 et 10.189 , ils seront pris tous les 2 car la recherche est 10.1

    Car tu as dit les 3 premiers chiffres.

    Si ce n'est pas ça, c'est peut-être le format du fichier (windows au lieu de linux/unix)

    La soluce de Flodelarab est plus pertinente si elle fonctionne, car elle compare bien des nombre et non des caractères

    Merci pour l'explication!
    Je suis sur Unix, je pense comme tu l'as dit que c'est lié à la méthode de tri

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Je suis sur Unix,
    lequel ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Si c'est 3 chiffres après la virgule, sens-toi libre de multiplier par 1000, et non par 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vp=1000 'NR==FNR{arr[int($1*p)/p]++;next} (int($1*p)/p) in arr'

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2010, 11h15
  2. lire des valeurs vides dans un fichier txt
    Par bakaratoun dans le forum MATLAB
    Réponses: 5
    Dernier message: 14/12/2009, 16h15
  3. Attribution des valeurs lues dans un fichier texte
    Par law56100 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/05/2008, 16h07
  4. Réponses: 1
    Dernier message: 13/03/2007, 09h52
  5. Récupérer des valeurs dans des fichiers html
    Par nico93100 dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 21h46

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