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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    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
    Points : 7 842
    Points
    7 842
    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 régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    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
    Points : 7 842
    Points
    7 842
    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 régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    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
    Points : 7 842
    Points
    7 842
    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.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    un script awk n'est pas plus indiqué pour ce genre de traitement ?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    je regrette et sais que ça va compliquer la chose, mais je ne peux envoyer sur un forum public les fichiers originaux tels qu'ils sont, en effet ils contiennent des données nominatives personnelles, espérant que tu puisses le comprendre malgré l'exigeance de ma demande.

    J'essaie de reprendre le pb plus clairement si tu es d'accord, car je pense que mes explications sont un peu brouillonnes :

    Le fichier 8.txt,comportant n lignes, et issu de diverses opérations de mise en forme d'une base de données désordonnée, contient ce schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "$var1"
    "$var2"
    "$var3"
    ...
    "$varn"
    Toutes ces variables peuvent contenir des caractères spéciaux comme \, %
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Paul%\Dupont
    %Jacques%\Blanc Imbert
    ...
    %Pierre%\Jacques\Henri Mathieu
    L'autre fichier 10.txt, issu de deux opérations de mise en forme supplémentaires sur le précédent fichier 8.txt, et se présente comme ceci :

    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
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Puisque "%Paul%\Dupont" alors
    Puisque "%Jacques%\Blanc Imbert" alors
    ...
    Puisque "%Pierre%\Jacques\Henri Mathieu" alors
    Le "Mot clé" du schéma du fichier 10.txt est donc : Puisque (chaque ligne du fichier 10.txt commence donc par le mot Puisque)
    La "phrase1" du schéma du fichier 10.txt est donc : alors

    L'algorithme recherché est le suivant :

    pour chaque ligne i lue du fichier 10.txt
    assigner la ligne i à la variable var
    copier la valeur de cette variable var dans le fichier z.txt
    copier la valeur de cette variable var sous chaque ligne du fichier 10.txt qui commence par le mot Puisque
    réinitialiser la variable var
    Le résultat attendu est le suivant :

    • z.txt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $var1
    $var2
    $var3
    ...
    $varn
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %Paul%\Dupont
    %Jacques%\Blanc Imbert
    ...
    %Pierre%\Jacques\Henri Mathieu
    • 11.txt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Puisque "%Paul%\Dupont" alors
    vérifier que "%Paul%\Dupont" est bien présent
    Puisque "%Jacques%\Blanc Imbert" alors
    vérifier que %Jacques%\Blanc Imbert" est bien présent
    ...
    Puisque "%Pierre%\Jacques\Henri Mathieu" alors
    vérifier que "%Pierre%\Jacques\Henri Mathieu" est bien présent
    Est-ce que c'est suffisament clair ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Leve la main au fond
    Euh moi jai pas tout compris =)

    Tu as deux fichiers en entrée 8.txt et 10.txt :

    8.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %Paul%\Dupont
    %Jacques%\Blanc Imbert
    ...
    %Pierre%\Jacques\Henri Mathieu

    10.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Puisque "%Paul%\Dupont" alors
    Puisque "%Jacques%\Blanc Imbert" alors
    ...
    Puisque "%Pierre%\Jacques\Henri Mathieu" alors
    Et tu veux obtenir le fichier
    11.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Puisque "%Paul%\Dupont" alors
    vérifier que "%Paul%\Dupont" est bien présent
    Puisque "%Jacques%\Blanc Imbert" alors
    vérifier que %Jacques%\Blanc Imbert" est bien présent
    ...
    Puisque "%Pierre%\Jacques\Henri Mathieu" alors
    vérifier que "%Pierre%\Jacques\Henri Mathieu" est bien présent
    D'après ce que tu nous a dis voici les infos :
    Chaque ligne du fichier 10.txt commence donc par le mot Puisque
    J'aimerais savoir :
    - Si variable "%Paul%\Dupont" est succédé par le mot clé alors".
    - Si les données de la nouvelle ligne en dehor de la variable sont fixes.


    je verrais alors un truc comme ca :
    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
     
    awk '
    BEGIN{
     
    debut="Puisque";
    i_debut=length(debut);
     
    succede="alors";
     
    debut_new_line="vérifier que ";
    fin_new_line=" est bien présent";
    }
    {
     i_succede=index ($0,succede);
     variable=substr($0,i_debut,(i_succede-i_debut);
     print("%s",succede);
     print ("%s%s%s",debut_new_line,variable,fin_new_line);
    }
    ' 10.txt > 11.txt
    Il y'a certainement mass faute de syntaxe dans ce script mais j'ai pas de quoi tester.

    ps : je n'ai pas vu la différence entre le fichier 8.txt et z.txt de ton exemple

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    - Si variable "%Paul%\Dupont" est succédé par le mot clé alors".
    oui, tout à fait, chaque ligne du fichier 10.txt commencent par puisque et se terminent par alors, au milieu, la variable du fichier 8.txt

    - Si les données de la nouvelle ligne en dehor de la variable sont fixes.
    oui aussi, la nouvelle ligne doit tjs commencer par "vérifier que" et se terminer par "est bien présent"

    Je ne connais pas du tout le langage awk - bien qu'y ayant été initié il y a quelques années en fac - par contre je ne vois aucune référence au fichier 8.txt dans le script que tu proposes, c'est normal ?

    je n'ai pas vu la différence entre le fichier 8.txt et z.txt de ton exemple
    oui en fait c'est vrai, c'est juste une copie du fichier 8.txt. Un simple cat 8.txt > z.txt devrait suffire. Mais cet aspect n'est pas très important et à la limite optionnel, l'essentiel c'est d'arriver à ce que la valeur de la variable s'affiche dans la deuxième ligne de 11.txt (sous chaque ligne "puisque $var alors")

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Je ne connais pas du tout le langage awk - bien qu'y ayant été initié il y a quelques années en fac - par contre je ne vois aucune référence au fichier 8.txt dans le script que tu proposes, c'est normal ?
    Oui, ton fichier 10.txt comporte déjà la variable, on va simplement la récupéré, si tu ne connasi pas le awk je t'explique rapido :

    Le awk prend en entré un flux, ici un fichier, et le lit ligne par ligne. Le traitement déclaré entre les quotes est un traitement fait pour chaque ligne.

    Avant de lire une ligne execution du bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN{
    // instructions
    }
    Pour chaque ligne lu execution des instructions contenues dans les balises suivantes

    Je commente :

    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
     
    # appel du binaire awk
    awk '
    # block lu une fois au début du traitement
    BEGIN{
     
         #chaine entière devant la variable d'une ligne du fichier 10.txt
         debut="Puisque";
         #récupération de la longueur de la chaine
         i_debut=length(debut);
     
         # chaine présente juste après la variable contenue dans la ligne du fichier 10.txt
         succede="alors";
     
         #variables nécessaire au formatage de la nouvelle ligne
         debut_new_line="vérifier que ";
         fin_new_line=" est bien présent";
    }
    # block executé sur chaque ligne, la ligne courante est récupérée dans la variable $0
    {
         #récupération de l'index de caractère succedant la variable
         i_succede=index ($0,succede);
         # récupération de la variable en découpant la ligne courante à partir du caractère à l'indice i_succede, pour une longueur de i_succede-i_debut
         variable=substr($0,i_debut,(i_succede-i_debut));
     
         #affiche de la ligne lue (celle-ci ne change pas)
         print("%s",$0);
         # on intercal juste après la ligne lue, la nouvelle ligne qui est formaté :
         # vérifier que VARIABLE est bien présent
         print ("%s%s%s",debut_new_line,variable,fin_new_line);
    }
    ' 10.txt > 11.txt
    ATTENTION : y'avait des erreurs dans ce que j'ai ecrit plus, encore une fois je n'ai pas pu tester j'ai pas le mattos pour.

    ATTENTION2 : dans le script il faut absolument que la chaine définit dan le block BEGIN : succede ne puisse pas être inclus dans la variableà récupérer, sinon l'indice obtenu est érroné.

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par eZula Voir le message
    Je ne connais pas du tout le langage awk - bien qu'y ayant été initié il y a quelques années en fac
    awk n'est pas un langage, mais un utilitaire (un binaire, un éxécutable, un programme, une application, etc etc..)




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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    awk n'est pas un langage, mais un utilitaire
    merci pour la précision

    sinon ça a l'air de fonctionner, à ceci près que le fichier 11.txt se présente comme ceci

    %s Puisque "%Paul%\Dupont" alors
    %s%s%s vérifier que t "%Paul%\Dupont" est bien présent
    %s Puisque "%Jacques%\Blanc Imbert" alors
    %s%s%s vérifier que t "%Jacques%\Blanc Imbert" est bien présent
    les deux pbs étant :
    - ce t avant $var (le t est en fait la dernière lettre du mot précédent $var dans la première ligne, ce n'est pas puisque le vrai mot-clé, mais une phrase de deux mots sans caractères spéciaux ; est-ce que ça peut correspondre à ton Attention2 ?
    - ces %s%s%s
    - dans la première ligne de 11.txt, il y a trois espaces entre $var et "alors", au lieu d'un, même chose entre $var et "est bien présent" pour la deuxième ligne de 11.txt

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    On va y arriver

    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
    # appel du binaire awk
    awk '
    # block lu une fois au début du traitement
    BEGIN{
    
         #chaine entière devant la variable d'une ligne du fichier 10.txt
         debut="Puisque";
         #récupération de la longueur de la chaine
         i_debut=length(debut)+2;
    
         # chaine présente juste après la variable contenue dans la ligne du fichier 10.txt
         succede="alors";
         
         #variables nécessaire au formatage de la nouvelle ligne
         debut_new_line="vérifier que ";
         fin_new_line=" est bien présent";
    }
    # block executé sur chaque ligne, la ligne courante est récupérée dans la variable $0
    {
         #récupération de l'index de caractère succedant la variable
         i_succede=index ($0,succede);
         # récupération de la variable en découpant la ligne courante à partir du caractère à l'indice i_succede, pour une longueur de i_succede-i_debut
         variable=substr($0,i_debut,(i_succede-i_debut-1));
        
         #affiche de la ligne lue (celle-ci ne change pas)
         printf("%s",$0);
         # on intercal juste après la ligne lue, la nouvelle ligne qui est formaté :
         # vérifier que VARIABLE est bien présent
         printf ("%s%s%s",debut_new_line,variable,fin_new_line);
    }
    ' 10.txt > 11.txt
    Voila ensuite joue avec les variables debut_new_ligne, et fin_new_ligne pour ajouter ou supprimer les espaces, ou avec les index que j'ai mis en rouge .

    Bon courage

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    je suis désolé, mais la dernière modif a généré un trop grand nombre d'erreur. Après avoir bataillé pour essayer de comprendre, j'ai opté pour une autre direction. Formulons le pb complètement autrement, et oublions quelques instants pierre, paul et leur antislash de malheur :

    soit un fichier a.txt contenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    coucou
    bonjour 
    salut
    ...
    On double les lignes du fichier a.txt et on les trie dans l'ordre pour qu'au final les mêmes lignes se succèdent :

    cat a.txt > b.txt && cat b.txt >> a.txt && sort a.txt > e.txt
    ce code plus ou moins dégueulasse donne le fichier e.txt suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    coucou
    coucou
    bonjour 
    bonjour 
    salut
    salut
    ...

    Maintenant, pour rester dans l'esprit du problème initial, il reste deux choses à faire :

    • ajouter au début de chaque ligne impaire l'expression Puisque " et à chaque fin de ligne impaire " alors


    • ajouter au début de chaque ligne paire l'expression vérifier que " et à chaque fin de ligne paire " est bien présent


    Bon par contre, je n'arrive pas à attraper les lignes paires ou impaires via sed. J'ai testé diverses combinaisons comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '2,~2' s/^/puisque "/g' e.txt > f.txt
    Je suis sur que c'est possible car il semblerait qu'il l'ait fait pour les deux lignes suivant la première du fichier e.txt, pas avec ce code mais un autre similaire que je ne retrouve plus. La syntaxe ne doit pas être correcte.

    Qu'est-ce que vous en pensez ?

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    J'ai enfin pu tester

    Voila ca devrait mieux marcher :
    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
     
    #!/bin/sh
     
    awk 'BEGIN{
     
         debut="Puisque";
         i_debut=length(debut)+2;
     
         succede="alors";
     
         debut_new_line="verifier que ";
         fin_new_line=" est bien present";
    }
    {
         i_succede=index ($0,succede);
         variable=substr($0,i_debut,(i_succede-i_debut-1));
     
         printf("%s\n",$0);
         printf("%s%s%s\n",debut_new_line,variable,fin_new_line);
    }
    ' 10.txt > 11.txt

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    Ok, merci ça fonctionne avec "verifier que " et " est bien present"

    Le pb c'est que ce sont des exemples et que ces expressions contiennent en réalité des >>, des \, des " et des % et on dirait que ça buggue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk: cmd. ligne:9:      fin_new_line=" >> "Expression_réelle"";
    awk: cmd. ligne:9:                                      ^ la barre oblique inverse n'est pas le dernier caractère sur la ligne
    Pour la parenthèse, que penses-tu de l'approche proposée à 19h50 ?

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Les problème de syntaxe sont du au caractères spéciaux qui sont à protéger par le caractère \ (antislash)

    Donc une chaine contenant " doit proteger son caractère : \"

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    variable="Le \"Shell\" c'est rigolo"
    Du coup pour un antislash ca fait \\

    Les caractères que tu as sité : > et % ne sont pas a proteger.

    Sinon pour ce qui est de l'approche dite de pair/impair je trouve ca un peu trop bidouille, j'espere que ce n'est pas du code qui sera à maintenir =)

    Il y'a aussi la possibilité d'utiliser ton premier fichier 8.txt

    Tu sembles avoir toute les données en main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/sh
     
    debut_ligne1="debut"
    fin_ligne1="fin"
     
    debut_ligne2="debut2"
    fin_ligne2="fin2"
     
    while read variable
    do
     
        echo "${debut_ligne1} ${variable} ${fin_ligne1}";
        echo "${debut_ligne2} ${variable} ${fin_ligne2}";
    done < 8.txt

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 165
    Points : 90
    Points
    90
    Par défaut
    Ecoute Delwyn, là je crois que c'est parfait et te remercie infiniment

    juste une dernière question si tu permets : par rapport à cette histoire de sed et de lignes paires et impaires, quelle aurait été la bonne syntaxe ? comment faire par exemple pour faire simple ajouter un Z à chaque début de ligne impaire d'un fichier ?

    c'est vraiment par curiosité et aussi parceque j'ai passé des heures dessus

+ 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