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 :

Interpolation de valeurs dans un fichier


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 Interpolation de valeurs dans un fichier
    Bonjour,
    J'ai un fichier contenant deux colonnes :

    12.050 .0000001617893
    12.149 .0000001560011
    12.248 .0000001521674
    12.348 0
    12.449 0
    ...

    Et j'ai des valeurs de références qui commencent à 12.020, et avancent de 0.150 :

    12.020
    12.170
    12.320
    12.470
    ...


    Tout en gardant les valeurs de la colonne 2, j'aimerais juste que les valeurs de la colonne 1 du fichier soient remplacées par les valeurs de référence les plus proche :

    12.050 sera remplacé par 12.020
    12.149 par 12.170
    12.248 par 12.320
    12.348 par 12.320
    12.449 par 12.470
    ...


    Sauriez-vous comment faire ?
    J'ai essayé avec cette boucle mais ce n'est pas précis parce que les valeurs qui ne sont pas dans le pas de 0.150 sont oubliées :

    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
     
    		for ((i=1202; i <= 2207; i += 15))
     
    		do 
    		    alt=$(echo "scale=3; ${i}/100" | bc)	       # création valeur de référence
    		    echo $alt  >> tab_$i                                # ecriture dans un fichier
                        fic2=tab_$i
                        awk -vp=10  'NR==FNR{arr[int($1*p)/p]++;next} (int($1*p)/p) in arr' {$fic2,$fichier}  >> AvAMA_$i     # comparaison valeur de réf/valeur du fichier
                        col2=$(awk '{ print $2 }' AvAMA_$i)               # selection colonne 2 à garder
     
                        echo $alt $col2 >> fichier_final
     
                        rm tab_$i AvAMA_$i
     
     
            done

    Et créer des fichiers pour des opérations intermédiaires n'est pas très malin j'imagine...

  2. #2
    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
    Moi, je le ferais bêtement avec awk, un truc du genre:
    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
    awk_script='
    BEGIN   {
                    ref0 = 12.020
                    pas  = 0.150
                    pas2 = pas/2
    }
    {       col1 = $1
            col2 = $2
     
            k = int((col1 + pas2 - ref0) / pas)
            ncol1 = ref0 + k * pas
            printf "%.3f ", ncol1
     
            if ( col2 == 0 ) { printf "0\n"}
            else { printf "%.13f\n", col2}
    }
    '
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk "${awk_script}" "plop"
    12.020 0.0000001617893
    12.170 0.0000001560011
    12.320 0.0000001521674
    12.320 0
    12.470 0
    Rq: je connais int qui tronque, mais pas de fonction qui arrondisse, d'où l'ajout de pas/2.
    Rq: je ne maîtrise pas très bien les formats de printf...

  3. #3
    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
    Cette méthode marche parfaitement!

    Je n'avais jamais pensé aux scripts awk, ça m'évite un tas d'opérations intermédiaires

    Merci à toi!

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    on notera bien toutefois, que, dans awk "${awk_script}" "plop", les accolades sont totalement superflues.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    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
    Citation Envoyé par N_BaH Voir le message
    on notera bien toutefois, que, dans awk "${awk_script}" "plop", les accolades sont totalement superflues.
    Tout à fait exact !
    C'est une vieille habitude (sur laquelle nous ne reviendrons pas) et qui m'aide pour la lecture et me libère, pour les rares (je l'accorde) cas où elles sont nécessaires, de la charge mentale de vérifier leur nécessité sans risquer de tomber sur un bug pas toujours évident à cerner au premier coup d'oeil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a=A; b=B; a_b=ab
     
    echo "ex1: $a_$b $a_b ${a}_${b}"
    ex1: B ab A_B
     
    echo "ex2: $a-$b $a-b ${a}-${b}"
    ex2: A-B A-b A-B
    Avec les accolades, j'obtiens ce que je veux dans tous les cas, même si elles ne sont nécessaires que dans l'exemple 1.
    C'est pour ça que j'ai pris l'habitude de les utiliser comme séparateur syntaxique pour ne pas me poser la question de leur nécessité.

    C'est aussi pour limiter les erreurs de frappe que j'utilise souvent l'option set -u en début de script.

  6. #6
    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
    Citation Envoyé par GlmGil Voir le message
    Je n'avais jamais pensé aux scripts awk, ça m'évite un tas d'opérations intermédiaires
    Lorsque j'ai à traiter un fichier avec des colonnes et avec un peu de traitement algorithmique, j'aime bien utiliser un "vrai" langage de programmation, comme "awk", qui est plus puissant que certains ne l'imaginent quand ils voient de simples awk '{print $2}' par exemple.

    PS: Je ne nie pas que "bash" est aussi un "vrai" langage de programmation...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    [...]Avec les accolades, j'obtiens ce que je veux dans tous les cas, même si elles ne sont nécessaires que dans l'exemple 1.
    C'est pour ça que j'ai pris l'habitude de les utiliser comme séparateur syntaxique pour ne pas me poser la question de leur nécessité.

    C'est aussi pour limiter les erreurs de frappe que j'utilise souvent l'option set -u en début de script.
    tout ça n'inspire pas confiance. Ça ne met pas en valeur tes compétences.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    PS: Je ne nie pas que "bash" est aussi un "vrai" langage de programmation...
    Sauf qu'en bash pure, on ne peut pas tout faire

  9. #9
    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 jack-ft Voir le message
    Moi, je le ferais bêtement avec awk, un truc du genre:
    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
    awk_script='
    BEGIN   {
                    ref0 = 12.020
                    pas  = 0.150
                    pas2 = pas/2
    }
    {       col1 = $1
            col2 = $2
     
            k = int((col1 + pas2 - ref0) / pas)
            ncol1 = ref0 + k * pas
            printf "%.3f ", ncol1
     
            if ( col2 == 0 ) { printf "0\n"}
            else { printf "%.13f\n", col2}
    }
    '

    Bonjour,

    je me permets de rebondir dans cette discussion pour une petite question sur le même sujet.
    Je vois que ce script marche très bien mais j'aurais besoin de savoir combien de valeur de mon fichier initial sont 'interpolable' par chaque valeur de référence.

    Par exemple :

    j'ai ce fichier ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    12.03100
    12.05900
    12.49500
    12.49800
    12.50000
    12.50500
    12.78700
    12.81200
    et j'aimerais savoir combien de valeur exactement sont 'interpolable' par la valeur ref 12.020 ?


    En fait mon but est de faire ces comparaisons sur plusieurs fichiers et d'interpoler aux valeurs ref le fichier où il y a le plus grand nombre de valeurs interpolables

    C'est peut-être pas très clair dit comme ça mais voilà un exemple :

    premier fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    12.03100
    12.05900
    12.49500
    14.00599
    deuxième fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    12.02100
    12.08900
    12.23564
    12.45500
    12.55555
    13.56600
    14.00245
    Donc ce sera le fichier 2 auquel je vais interpoler ma valeur ref 12.020.

    Vous sauriez comment faire ça ?

    Merci pour votre aide!

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

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

    Compte-les, au lieu de les afficher.

    Ensuite, tu peux utiliser la variable intégrée FILENAME comme clé de tableau associatif, pour écrire les fichiers les uns à la suite des autres dans la ligne de commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '... nb[FILENAME]++; ...' fichier1.txt fichier.txt fichier2.txt fichier3.txt fichier4.txt fichiern.txt
    Il ne reste plus qu'à trouver le max du tableau nb[], et son indice associé.

  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
    Bonjour !

    Je ne suis pas sûr d'avoir compris, en gros il faudrait ranger les valeurs interpolées dans un fichier temporaire pour chaque valeur 'ref' , et de compter combien il y en a dans chaque fichier c'est ça ?

    Pas sûr de bien savoir m'y prendre, je ne comprends pas vraiment comment fonctionne le script awk

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/03/2012, 15h58
  2. [VBA-E] Lire des valeurs dans un fichier excel
    Par nicobox dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 11/05/2006, 15h40
  3. [VB]vérifier des valeurs dans un fichiers et trier
    Par Mut dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/02/2006, 17h35
  4. Récupérer des valeurs dans des fichiers html
    Par nico93100 dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 21h46
  5. [D6] Recherche d'une valeur dans un fichier
    Par Lung dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2005, 08h26

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