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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    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.

+ 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