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

  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    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 835
    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 835
    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 659
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    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
    161
    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 : 161
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    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
    161
    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 : 161
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    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 confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    @Flodelarab
    Je vais réfléchir à tête reposée à cela.
    Merci.

  9. #9
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Je sais que ce n'est pas un fin en soit mais si il n'y a pas de raison particulière pour n'utiliser QUE sed, j'utiliserais plutôt awk qui est très adapté pour ce genre de modifications

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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]

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Le plus simple c'est de transformer le -n en -e en supprimant les lignes qui n'ont pas OPCVM.
    C'est l'idée inverse de N_BaH mais petite erreur entre des quotes et des guillemets

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Citation Envoyé par Liamm
    dans mon éditeur, la coloration m'indique une erreur de "syntaxe"
    en effet. j'ai corrigé dans mon message :sed -n $VAR2',...' fic1 > fic2il serait bon que tu nous montres un échantillon représentatif du fichier d'origine, et la sortie que tu souhaites en obtenir.
    avec quelques explication sur les raisons des modifications.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Peut-être fermer le bloc de commande aussi ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    ouaip! corrigé. merci.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    @ becket
    j'utilise plutôt awk ou gawk pour la réorganisation des colonnes en sortie
    et
    pour l'insertion de colonne
    et
    pour les impressions formatées avec printf.

    = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    @Sve@r
    Si, c'est certain, dans mon cas, j'ai une duplication de ligne due, je pense à un filtrage des lignes "OPCVM" que tu ne reproduis pas dans ton exemple.

    Par contre :
    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.
    c'est intéressant, ça permet d'utiliser moins de fichiers temporaires.
    Mais la machine lit le fichier d'entrée trois fois alors que la vraie question d'origine est de savoir comment faire le traitement en une seule lecture.

    = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    @disedorgue
    cela donnerait quoi comme code ?

    = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
    @N_BaH
    Merci, je testerai cet après midi ce que cela donne !
    et
    je reviendrai vers vous pour vous le dire

    Merci à tous
    TDLT

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 291
    Par défaut
    Mignonnes ces lignes de "=". Sur le forum, la balise [ hr ] [ / hr ] permet de faire cette ligne horizontale dans le style du forum.
    Exemple :


    et autre exemple :



  17. #17
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    @Flodelarab
    C'est noté
    Elles ne sont pas identiques pour autant.

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Liamm Voir le message
    @Sve@r
    Si, c'est certain, dans mon cas, j'ai une duplication de ligne due, je pense à un filtrage des lignes "OPCVM" que tu ne reproduis pas dans ton exemple.
    Ben c'est normal, je t'ai dit "tente dans un premier temps de ne faire que le "-e" pour voir si le souci vient du "-n". Et tu réponds "ne mettre que des -e ne fonctionne pas! ça me donne des lignes en double (hier 17h42)".
    Donc je reproduis un exemple ne mettant que des "-e". Ne viens pas alors dire "oui mais tu n'as pas filtré les lignes" (ce filtrage étant justement fait par le sed -n que le test prévoit justement de ne pas mettre!!!)

    Citation Envoyé par Liamm Voir le message
    Mais la machine lit le fichier d'entrée trois fois
    Plus exactement la commande n° X lit le traitement généré par la commande X-1. Si la commande X-1 a shunté les $VAR2 premières lignes, ce qui est lu ensuite en est réduit d'autant.

    Citation Envoyé par Liamm Voir le message
    alors que la vraie question d'origine est de savoir comment faire le traitement en une seule lecture.
    Fichier xxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    null
    null
    null
    null
    null
    null
    null
    null
    anglais:Hello
    anglais:World
    français:Le temps est beau
    français:Mais il se couvre
    anglais:end
    Avec la commande de N_Bah...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed -n 9',${/^anglais:/s/$/THIPEA/p}' xxx
    anglais:HelloTHIEPA
    anglais:WorldTHIEPA
    anglais:endTHIEPA

    Ensuite si le besoin évolue il reste carrément l'arme ultime awk...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ awk '{if (NR <= 8) next; if ($0 ~ /^anglais:/) printf("%sTHIEPA\n", $0)}' xxx
    anglais:HelloTHIEPA
    anglais:WorldTHIEPA
    anglais:endTHIEPA
    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]

  19. #19
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    161
    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 : 161
    Par défaut
    @N_BaH
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  $VAR2',${ s/$/THIPEA/, /\;OPCVM\;/p}'   ftmp2.csv > ftmp3.csv
    donne l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 18: option inconnue pour «*s*»

    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  $VAR2',${/\;OPCVM\;/s/$/THIPEA/p}'       ftmp2.csv > ftmp3.csv
    Marche bien !
    Ça mérite un point !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Citation Envoyé par Liamm Voir le message
    @N_BaH
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n  $VAR2',${ s/$/THIPEA/, /\;OPCVM\;/p}'   ftmp2.csv > ftmp3.csv
    donne l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 18: option inconnue pour «*s*»
    parce que la seconde virgule devrait être un point-virgule.
    j'ai corrigé mon message.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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