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 :

Boucle while dans boucle while


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Par défaut Boucle while dans boucle while
    Bonjour à tous

    je suis auto didactique et débutant en script shell. veuillez m'excuser par avance pour cette question mais après plusieurs recherches dans le forum et lecture de cours bash je ne trouve pas ma réponse ou en tout cas comment réaliser cette opération.

    Le but est d'itérer tout les fichiers d'un dossier comprenant des fichiers .txt de 7lignes chacun et de comparer avec un fichier de 400 lignes pour trouver une concordance.

    je souhaite imbriquer plusieurs boucles while comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i=1
    # boucle fichier
    while (($i <= Nombrefichier)) ; do
        echo $i 
        j=1 
        # boucle ligne
        while (($j <= Nombreligne)) ; do
     
            echo $j
            ((j=j+2))
        done
        ((i++))
    done

    il me semble avoir compris que le problème vient de la création de sous shell. et qu'un while read ... done<<< fichier.txt
    permet de résoudre le problème. mais j'arrive pas à le faire

    voici mon code désolé car il est pas très propre.

    ##############################

    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
    76
    77
    78
    79
    80
    81
    82
    83
    echo "Demarrage comparaison"
     
    find . -type f -name "tmpdat*.txt" | awk -F. '
    {a[$NF]++;} END{for (i in a) print a[i];}'| cat > NBtmpdat.txt 
    # recherche groupe de fichier à iterer "fichier*" et renvoie leur nombre dans NBtmpdat.txt
     
    NBFichier=$( awk 'NR == 1 {print}' NBtmpdat.txt)
    #renvoie le nb de fichier à itérer
     
    echo "nb de fichier: $NBFichier"
    #controle insertion NBtmpdat.txt dans valeur dans $NBFichier
     
    ITFichier=1
    Ri=1
    ARC=Final.dat
    #insertion nom gros fichier dans variable
     
    $CNbLigne=$(awk 'END {print NR}' $ARC)
    #renvoie le nb de ligne à itérer
     
    echo $CNbLigne
    #controle insertion Nb ligne dans valeur dans $CNbLigne
     
    while (($ITFichier <= $NBFichier)) ; do
     
    # Courbe Reférence
     
    	Rj=1
    	RJ1=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+1))
    	RJ2=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+2))
    	RJ3=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+3))
    	RJ4=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+4))
    	RJ5=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+5))
    	RJ6=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
    	((Rj=Ri+6))
    	RJ7=$(awk -F';' 'NR=='$Rj' {print $3}' tmpdat$Ri.txt)
     
    	RNom=$(awk -F';' 'NR=='$Ri' {print $1}' $ARC)
    	echo "Nom courbe comparateur" $RNom
     
           #Courbes A Comparer
     
    	echo "nb de ligne" $CNbLigne
    	i=1
            ItLigne=1
     
    	while (( $ItLigne <= $CNbLigne )) ; do
     
    		((j=i))
    		CJ1=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+1))
    		CJ2=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+2))
    		CJ3=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+3))
    		CJ4=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+4))
    		CJ5=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+5))
    		CJ6=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
    		((j=i+6))
    		CJ7=$(awk -F';' 'NR=='$j' {print $3}' $ARC)
     
     
    		Nom=$(awk -F';' 'NR=='$i' {print $1}' $ARC)
    		echo "Nom courbe comparée " $Nom
     
     
    		((i=i+7))
    		echo "Iteration i" $i
    		((CItLigne=CItLigne+7))
    		echo "Iteration Iterateur de ligne" $CItLigne
    	done
     
    	((Ri++))
        ((ITFichier++))
     
    done
    je vous remercie d'avance pour vos conseils

    merci à tous

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

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

    Le but est d'itérer tout les fichiers d'un dossier comprenant des fichiers .txt de 7lignes chacun et de comparer avec un fichier de 400 lignes pour trouver une concordance.
    tu dois d'abord détailler les opérations (pas à pas) à effectuer pour atteindre ce but.

    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pour un_fichier parmi les_fichier_.txt
    faire
       quoi avec quoi et quoi d'autre ?
       quoi d'autre avec quoi et quoi d'autre ?
    fait
    oublie ton script. je sais : c'est dur, mais nécessaire.
    décris la méthode, l'enchainement des opérations... fais un schéma...
    d'abord !

    comment ferais-tu "à la main" ?

    on verra pour le code après.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Par défaut
    merci N_BaH pour ta réponse rapide
    je comprends. Je vais poser au clair mes idées et reviens avec un post plus clair.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2017
    Messages : 15
    Par défaut
    Pour être plus précis, j'ai un fichier contenant un ensemble de courbes doubles. X fois 2 colonnes 7 lignes. je cherche à trouver celles-qui se ressemblent à +-5%. Ma première solution a été de décomposer le groupe de courbes en une multitude de fichiers contenant l'ensemble "courbe double". courbes1( 2 colonnes 7 lignes) courbe2( 2 colonnes 7 lignes) .... Courbes n( 2 colonnes 7 lignes). Puis de prendre cette ensemble (2 colonnes 7 lignes) et scanner le document contenant l'ensemble des courbes doubles afin de trouver une correspondance. Le problème c'est que je ne connait pas à l'avance le nombre de courbes.

    d'ou mon while prendre fichier (pattern)
    while comparer chaque (pattern) à l'ensemble de ligne.

    je peux tourner autrement le problème pour contourner le while dans le while. créer 7 array (tableau) composé de :
    array1 = valeur 1, valeur 8, Valeur 15,...valeur n+7
    array2 = valeur 2, valeur 9, Valeur 16,...valeur n2+7
    array3 = valeur 3, valeur 10, Valeur 17,...valeur n3+7
    ......
    array7 = valeur 7, valeur 14, Valeur 21,...valeur n7+7.

    si valeur 8 array1 - 5% < valeur 1 array1 < valeur 8 array1 +5% alors
    si valeur 9 array2 - 5% < valeur 2 array2 < valeur 9 array2 +5% alors
    si valeur 10 array3 - 5% < valeur 3 array3 < valeur 10 array3 +5% alors
    ......
    si valeur 14 array7 - 5% < valeur 7 array7 < valeur 14 array7 +5% alors echo "les courbes sont similaires"

    sinon echo "les courbes ne sont pas similaires"
    puis continu test

    si valeur 15 array1 - 5% < valeur 1 array1 < valeur 15 array1 +5% alors
    si valeur 16 array2 - 5% < valeur 2 array2 < valeur 16 array2 +5% alors
    si valeur 17 array3 - 5% < valeur 3 array3 < valeur 17 array3 +5% alors
    ......
    si valeur 21 array7 - 5% < valeur 7 array7 < valeur 21 array7 +5% alors echo "les courbes sont similaires"

    sinon echo "les courbes ne sont pas similaires"
    puis continu test

    et ce jusqu'à la fin du fichier

    puis si concordance courbe 1 essai sur courbe 2...

    bon voila étant nouveau en programmation désolé si je suis pas assez précis mais j'ai mal à la tête avec les si/sinon/while/sous shell..........

    j'espère que c'est plus clair

    en annexe le type de txt généré. composé de :

    nom de la courbe | nom du point | courbe 1 | courbe 2 |

    je vous remercie pour vos conseils et toutes aides car j'ai vraiment du mal
    Fichiers attachés Fichiers attachés

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    Mais pourquoi pas utiliser un langage plus convenable et plus adapté aux calculs numeriques que bash? Disons, python ou perl.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 153
    Par défaut
    Alors, chaque courbe est représentée par 14 valeurs. Les courbes a1, ..., a14 et b1, ..., b14 sont similaires si a_k et b_k diffèrent de 5% au maximum pour tout k. Il s’agit de 5% de quoi ?

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 05/08/2010, 13h06
  2. [MySQL] while dans un while
    Par kopax dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/04/2010, 08h21
  3. [MySQL] while dans une while ?
    Par link.80 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/06/2009, 18h09
  4. boucle "for" dans "do while"
    Par oranoutan dans le forum C#
    Réponses: 13
    Dernier message: 05/06/2007, 21h13
  5. Requete SQL dans boucle while
    Par vince_grenoblois dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 04/08/2006, 20h41

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