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 :

Traitement ligne par ligne, variable


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut Traitement ligne par ligne, variable
    Salut,

    je bute sur le pb suivant :

    un fichier 8.txt contient des centaines de lignes dans ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Exp1%\Exp2\nom1
    %Exp4%\nom2
    %Exp2%\nom3 nom7
    ...
    je souhaite que pour la totalité du fichier 8.txt, chaque ligne soit lue et enregistrée comme une variable provisoire et que cette variable soit reportée (à un emplacement précis) dans un autre fichier (9.txt). Donc, une fois que la ligne (i-1) est reportée dans 9.txt, on passe à la ligne i et ainsi de suite jusqu'à ce qu'on ait atteint la fin du fichier 8.txt.
    Avant d'envisager de placer ces variables à un emplacement précis d'un fichier (contenant lui aussi plusieurs centaines de lignes), j'aimerais au moins arriver à le faire dans un simple fichier vierge (z.txt)

    Après de nombreuses recherches, j'ai cru comprendre qu'il était préférable d'utiliser "while read ligne" plutot qu'une boucle "for i in 8.txt". Voilà où j'en suis pitoyablement arrivé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line ; do var=$line ; echo $var >> z.txt ; var= ; done < 8.txt
    ça a l'air de marcher mais ça me semble hasardeux, et de plus, ce qui est super gênant, c'est que ça hache les lignes contenant des espaces et que ça enlève des caractères spéciaux tels que les antislash

    J'ai vu par ailleurs un tas d'autres commandes, telles que perl, awk... et là je commence sérieusement à m'embrouiller. Est-ce que vous pourriez me donner une piste supplémentaire orientée vers la solution recherchée ?

    Merci

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -r line ; do var="$line" ; printf "%s\n" "$var" >> z.txt ; var= ; done < 8.txt

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut
    Ok, merci jlliagre ça marche bien. Néanmoins il reste un souci : comme dit plus haut, cette variable $var doit être également insérée dans un autre fichier (11.txt et non pas 9.txt comme dit plus haut).
    Pour cela j'utilise sed car la variable doit apparaitre sous chaque ligne commençant par un mot-clé, voici grossomodo la commande à partir de ce que tu as proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -r line ; do var="$line" ; printf "%s\n" "$var" >> z.txt ; sed '/^Mot clé/s/$/\necho phrase1 "$var" phrase2/' 10.txt > 11.txt ; var= ; done < 8.txt
    et en fait, dans le fichier 11.txt c'est "$var" qui apparait à chaque fois et non pas les valeurs successives de cette variable. J'ai essayé avec des guillemets simples et ça ne donne rien de plus

    Vois-tu une solution ?

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    La commande devient trop complexe pour tenir raisonnablement sur une seule ligne.

    Remet çà en forme et envoie un exemple de fichier 10.txt.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Par défaut
    Salut,

    pour la mise en forme, j'ai tenté comme ceci dans un script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while read -r line ; 
    do var="$line" ; 
    printf "%s\n" "$var" >> z.txt ; 
    sed '/^Mot clé/s/$/\necho phrase1 "$var" phrase2/' 10.txt > 11.txt ; 
    var= ; 
    done < 8.txt
    Il ne se passe rien, alors que dans le terminal ça fonctionne.

    Le fichier 10.txt, de n lignes, contient ce schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mot clé "$var1" phrase1
    Mot clé "$var2" phrase1
    Mot clé "$var3" phrase1
    Mot clé "$var4" phrase1
    ...
    Mot clé "$varn" phrase1
    Le but c'est que dans ce fichier 11.txt, on retrouve ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Mot clé "$var1" phrase3
    phrase2 "$var1" phrase3
    Mot clé "$var2" phrase3
    phrase2 "$var2" phrase3
    Mot clé "$var3" phrase3
    phrase2 "$var3" phrase3
    ...
    Mot clé "$varn" phrase3
    phrase2 "$varn" phrase3
    Chaque "phrase*" peut contenir des caractères spéciaux dans le genre "", \, %

    Le pb est donc qu'en lieu et place de "$vari" (variable var i), il y ait chaque fois la valeur qu'elle prend au fur et à mesure de l'exécution de la "boucle" while read line

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Peux tu envoyer un fichier 10.txt qui correspond au 8.txt original:
    %Exp1%\Exp2\nom1
    %Exp4%\nom2
    %Exp2%\nom3 nom7

    et le fichier 11.txt attendu avec ces données.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. [XL-2010] VBA : traitement ligne par ligne
    Par dttpedt dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/04/2014, 14h12
  3. Parcourir un Db_GRID ligne par ligne
    Par sanosuke dans le forum Bases de données
    Réponses: 8
    Dernier message: 12/05/2008, 12h14
  4. variable "ligne par ligne"
    Par ddelec24 dans le forum Langage
    Réponses: 2
    Dernier message: 15/12/2007, 11h55
  5. Traitement ligne par ligne sans curseur
    Par AbyssoS dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/02/2006, 17h46

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