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 :

Supprimer un champ avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut Supprimer un champ avec awk
    Bonjour,

    La boite de dialogue de sélection de fichiers de zenity me renvoie une sortie de ce format:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "$fichiers"
    /home/debian/lance-vnc-ssh|/home/debian/materiel.html|/home/debian/Menu.desktop
    Comme je ne sais pas a priori le nombre de fichiers qui seront sélectionnés, je fais une boucle me permettant de traiter un à un chacun des fichiers jusqu'à ce qu'il n'y en ait plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Je vérifie qu'il y a bien au moins un fichier sélectionné
    if [ -n "$fichiers" ]
       then fini="non"
       else fini="oui"
    fi
    while [ "$fini" = "non" ]; do
       fichier=$(echo "$fichiers" | awk -F "|" '{print $1}')
       echo "$fichier"
      # ici je veux supprimer le 1er champ pour reprendre la boucle avec les champs restants
       fichiers=$(echo "$fichiers" | awk -F "|" '{$1="";print}')
       if [ -z "$fichiers" ]
          then fini="oui"
       fi
    done
    Mais à la sortie de la commande de suppression de champ, awk supprime bien le 1er champ mais change le caractère séparateur puisqu'en testant la sortie j'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "$fichiers"
    /home/debian/materiel.html /home/debian/Menu.desktop
    Ce qui rend ma boucle inopérante.

    Pourquoi awk change-t-il le caractère séparateur de champ ? Comment supprimer le champ proprement sans modifier le caractère séparateur ?

    Merci d'avance pour votre éclairage.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    salut,

    KISS !
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ fichiers='/home/debian/lance-vnc-ssh|/home/debian/materiel.html|/home/debian/Menu.desktop'
    $ IFS='|' read -a ar <<<"$fichiers"
    $ printf '%s\n' "${ar[@]}"
    /home/debian/lance-vnc-ssh
    /home/debian/materiel.html
    /home/debian/Menu.desktop
    $
    yapuka traiter le tableau avec une boucle for...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut
    Merci pour ta solution, N_BaH.
    J'ai encore beaucoup de choses à apprendre en bash et je ne connaissais pas la commande read et ses options.

    Une demande de précision: importe-t-il de remettre IFS à sa valeur initiale avant de sortir du script, ou cela se fera-t-il automatiquement une fois sorti du script ?

    Par ailleurs, étant d'un naturel curieux au-delà du simple but d'avoir un script qui fonctionne, j'aimerais quand même savoir pourquoi awk change la caractère séparateur de champ !
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    l'IFS n'est modifié que pour la commande read utilisée à ce moment du script.

    quant à awk, son séparateur de sortie (OFS) reste celui par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "$fichiers" | awk  'BEGIN{FS=OFS="|"}{$1="";print}'
    |/home/debian/materiel.html|/home/debian/Menu.desktop
    mais on voit que ça ne fait pas ce qu'on attend, car le champ #1 est vide, il n'a pas cessé d'exister.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "$fichiers" | awk  'BEGIN{FS=OFS="|"}{$1="";for(i=1;i<=NF;i++)print ">"$i"<"}'
    ><
    >/home/debian/materiel.html<
    >/home/debian/Menu.desktop<
    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "$fichiers" | awk 'BEGIN {FS=OFS="|"} {$1=""; sub(/\|/, "")}1'
    /home/debian/materiel.html|/home/debian/Menu.desktop

    je préfère quand même ma solution 100% bash.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Bonjour,
    Dans la boucle, j'utiliserais ça plutôt que le tableau :
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    et si un nom de fichier comporte un espace ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut
    Merci pour tes précisions, N_BaH.
    Ma boucle supprime le 1er champ, mais pas le séparateur de champ si j'ai bien compris, d'où la persistance du 1er champ, mais vide.
    Je me coucherai un peu moins bête ce soir, comme on dit !

    J'ai sans hésitation adopté ta solution !

    J'ai de plus entre-temps découvert yad par lequel j'ai également sans hésitation remplacé zenity !
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    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 358
    Par défaut
    Une petite variante sans read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo "$fichiers"
    /home/debian/lance vnc ssh|/home/debian/materiel.html|/home/debian/Menu.desktop
    $ IFS='|' tab=(${fichiers})
    $ printf '%s\n' "${tab[@]}"
    /home/debian/lance vnc ssh
    /home/debian/materiel.html
    /home/debian/Menu.desktop

  9. #9
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 892
    Billets dans le blog
    1
    Par défaut
    Je prends note de toutes ces solutions dans mon memento script bash !
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  10. #10
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    A mon tour de proposer quelque chose :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fichiers="/home/debian/lance vnc ssh|/home/debian/materiel.html|/home/debian/Menu.desktop"
     
    while read fichier
    do
      echo $fichier
    done <<< "${fichiers//|/$'\n'}"
    /home/debian/lance vnc ssh
    /home/debian/materiel.html
    /home/debian/Menu.desktop

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Oui hizoka, mais y a plus qu'à croiser les doigts pour qu'aucun nom de fichier ne contienne un $'\n'...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    j'ai moinssé, car ça alourdit le code.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Parcourir et comparer des champs avec awk ?
    Par Gothan44 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 21/10/2013, 16h12
  2. Supprimer les doublons avec awk
    Par Hellgast dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 22/09/2013, 18h56
  3. Afficher un intervalle de champs avec awk
    Par sedawk dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 30/11/2011, 10h19
  4. Tronquer un champ avec awk
    Par ben_harper dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/01/2008, 10h22
  5. [PHP-JS] bouton reset ne supprimant pas des champs avec value
    Par SegmentationFault dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2006, 14h52

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