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 :

Commande sed en une seule passe


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Par défaut Commande sed en une seule passe
    Bonjour,

    Pourquoi ces 3 lignes de commandes qui marchent bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -e  "1,${VAR2}d"    ftmp2.csv  > ftmp3a.csv   #suppression des VAR2 premières lignes (suivant la valeur de VAR2)
    sed -n  "/\;OPCVM\;/p"  ftmp3a.csv > ftmp3b.csv   #ne garder que les lignes contenant ";OPCVM;"
    sed -e  "s/$/THIPEA/"   ftmp3b.csv > ftm3.csv     #ajouter en fin de ligne (dernier champ) : "THIPEA"
    ne sont pas équivalentes à cette commande ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -e  "1,${VAR2}d"    \
        -n  "/\;OPCVM\;/p"  \
        -e  "s/$/THIPEA/"   ftmp2.csv > ftmp3.csv
    ¿ Ne peut-on pas faire ce traitement en une seule passe avec la commande sed ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Liamm Voir le message
    Pourquoi ces 3 lignes de commandes qui marchent bien...ne sont pas équivalentes à cette commande...
    A mon avis (hypothèse) c'est le "-n" au milieu qui doit foutre la grouille. Tu devrais tenter l'expérience seulement avec les "-e" (je l'ai déjà fait et ça fonctionne bien). Et si ça marche, rajouter le "-n" mais peut-être en le mettant en premier.
    Et si le "-n" même en premier ne fonctionne pas, ben reste toujours le "une seule passe" mais via des pipes... sed -n ... ftmp2.csv | sed -e "..." -e "...". De là, on peut embrayer voir éventuellement ensuite si remplacer un sed -n par un bon vieux grep ne serait pas plus avantageux (de même que la suppression des $VAR2 premières lignes peut s'obtenir via un tail +$VAR2)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    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
    je ferais différemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  $VAR2',${ s/$/THIPEA/; /\;OPCVM\;/p}'   ftmp2.csv > ftmp3.csv
    soit
    pour les lignes entre $var2 (tu parles d'un nom de variable évocateur ! )
    ajouter THIPEA en fin de ligne
    afficher les lignes contenant \;OPCVM\; (pourquoi les point-virgules sont-ils protégés ??? )

    si j'ai correctement interprété ce que tu veux faire...

    edit:
    voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  $nbL',${/\;OPCVM\;/s/$/THIPEA/p}'   ftmp2.csv > ftmp3.csv
    (nbL pour nombre de lignes !)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Par défaut
    @Sve@r

    >> ne mettre que des -e ne fonctionne pas!

    En effet, les lignes auxquelles je rajoute "THIPEA" se retrouve en double :
    - une sans "THIPEA" à la fin
    - et l'autre identique avec "THIPEA" à la fin.

    >> mettre pour la deuxième commande -ne ne fonctionne pas non plus!

    En effet, les lignes auxquelles je rajoute "THIPEA" n'apparaissent plus.

    @N_BaH que je salue

    quand je copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  "${VAR2},${ s/$/THIPEA/, /\;OPCVM\;/p'   ftmp2.csv > ftmp3.csv
    dans mon éditeur, la coloration m'indique une erreur de "syntaxe"

    mais je vais encore cherché.

  5. #5
    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

    Pourquoi ces 3 lignes de commandes qui marchent bien ne sont pas équivalentes à cette commande ci-dessous :
    Ben ! La différence majeure est que la première version remplace les lignes, alors que la deuxième version va, potentiellement, écrire les lignes 2 fois. A priori. Je n'ai rien testé.

    J'explique : les logiciels n'ont aucune règle, ou norme, sur le traitement des options. Certains les considèrent au global (donc si 2 options sont contradictoires, c'est la deuxième qui gagne), d'autres respectent une séquence (on peut faire une option avec une cible et un autre paramètre avec une autre cible), d'autres, enfin, mixent les 2 (je pense a mplayer qui considère les options avant la liste de cibles comme globales et celle après chaque cible comme individuelle pour ce fichier). Du coup, quand je vois "-n" en plein milieu du sed, je ne sais pas comment il sera traité. Mais si j'imagine que le traitement est individuel, la ligne en cours sera écrite une fois par le "p" de la deuxième ligne, et une fois avec la troisième ligne. Si "-n" est gardé en mémoire, la troisième ligne n'affiche rien et ne sert à rien.

  6. #6
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Par défaut
    @Flodelarab

    Merci pour cette analyse.

    J'ai déjà remarqué que la commande sed est puissante, mais délicate à manier.

    Je n'ai jamais trouvé une bonne documentation expliquant le principe de fonctionnement de cette commande.

    Je ne suis pas assez calé en anglais pour exploiter directeman le man, la référence ($man sed).

    Notamment quand on parle de "pattern space" !
    Cette notion doit être importante à la compréhension du fonctionnement de la commande sed.

    Alors, je vais chercher encore (pour ne pas exploser le nombre de mes fichiers temporaires)

  7. #7
    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
    Tu réponds sur la forme mais pas sur le fond.

    "Pattern space", c'est l'espace de travail de sed. Il a 2 espaces : une mémoire (hold space) et un espace de travail. Il prend une ligne, la met dans son espace de travail, la travaille (modification, suppression, etc), et vide l'esapce pour passer à la ligne suivante. C'est précisément ce qui ne va pas dans ton message initial. Ta deuxième version va l'afficher, puis continuer à la travailler, puisqu'elle est toujours sur l'établi. Dans la première version, chaque ligne est remplacée à chaque passe.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Liamm Voir le message
    @Sve@r

    >> ne mettre que des -e ne fonctionne pas!

    En effet, les lignes auxquelles je rajoute "THIPEA" se retrouve en double :
    - une sans "THIPEA" à la fin
    - et l'autre identique avec "THIPEA" à la fin.


    Fichier "xxx"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    null
    null
    null
    null
    null
    null
    null
    null
    Hello
    World
    Le temps est beau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed -e "1,8d" -e "s/$/THIEPA/" xxx
    HelloTHIEPA
    WorldTHIEPA
    Le temps est beauTHIEPA
    Je ne vois aucune ligne dupliquée avec les "-e" à suivre...

    Citation Envoyé par Liamm Voir le message
    Alors, je vais chercher encore (pour ne pas exploser le nombre de mes fichiers temporaires)
    Le pipe ne te génère aucun fichier temporaire => sed -e "1,${VAR2}d" ftmp2.csv |sed -n "/\;OPCVM\;/p" |sed -e "s/$/THIPEA/" >ftmp3.csv.
    Et en jouant avec les canaux, on peut même s'arranger pour réécrire le fichier traité et éviter jusqu'à ftmp3
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<ftmp2.csv
    rm -f ftmp2.csv		# Obligatoire pour détacher le fichier du canal 3 ; ce qui permettra, quand on réécrira dedans, de ne pas vider le canal 3 qui sert d'input
    sed -e  "1,${VAR2}d" 0<&3 |sed -n  "/\;OPCVM\;/p" |sed -e  "s/$/THIPEA/" >ftmp2.csv

    Ensuite il y a effectivement la grosse artillerie awk
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    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 Liamm Voir le message
    Je ne suis pas assez calé en anglais pour exploiter directeman le man, la référence ($man sed).
    Peut-être qu'en cherchant en français, par exemple:
    man sed français

    (ou alors man sed français...)

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

Discussions similaires

  1. Combiner awk et sed sur une seule colonne
    Par irishupk dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 13/04/2019, 20h09
  2. Réponses: 2
    Dernier message: 25/09/2011, 01h01
  3. extraire une partie de chaine avec une seule ligne de commande sed
    Par kinkichin dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/07/2009, 10h28
  4. Réponses: 5
    Dernier message: 24/03/2009, 10h20
  5. [Oracle]commande MERGE sur une seule table
    Par DoRiane dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/08/2006, 17h13

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