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 :

Un cas de nom de fichier qui ne passe sous gawk (awk ?)


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut Un cas de nom de fichier qui ne passe sous gawk (awk ?)
    Bonjour,

    Si quelqu'un a une réponse pour que l'on puisse donner un nom de fichier comme BOB=1 à gawk ?

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat BOB\=1
    ligne 1
    ligne 2
    $ cat FOO
    ligne 1
    ligne 2
    $ cat BAR
    ligne 1
    ligne 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk '{print FILENAME":"$0}' BOB\=1 FOO BAR
    FOO:ligne 1
    FOO:ligne 2
    BAR:ligne 1
    BAR:ligne 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk '{print FILENAME":"$0}END{print "VAR BOB:" BOB}' BOB\=1 FOO BAR
    FOO:ligne 1
    FOO:ligne 2
    BAR:ligne 1
    BAR:ligne 2
    VAR BOB:1
    Cordialement.

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bon, j'ai trouvé une manière mais je trouve ça dommage...

    Il suffit d'étendre le chemin, donc avec ./BOB=1, ça passe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ awk '{print FILENAME":"$0}END{print "VAR BOB:" BOB}' ./BOB=1 FOO BAR
    ./BOB=1:ligne 1
    ./BOB=1:ligne 2
    FOO:ligne 1
    FOO:ligne 2
    BAR:ligne 1
    BAR:ligne 2
    VAR BOB:
    PS: Pour l'instant, je ne considère pas le sujet résolu
    Cordialement.

  3. #3
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Salut,

    Ça fonctionne seulement avec le chemin dès que le nom de fichier ressemble à une affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk '{print FILENAME}' './BOB=1'
    ./BOB=1
    Edit : suis trop lent !

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bon, allez, je passe en résolu...

    En considérant qu'au moins pour awk, étendre le chemin sur un nom de fichier histoire d'éviter d'avoir des surprises.
    Cordialement.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    En considérant qu'au moins pour awk, étendre le chemin sur un nom de fichier histoire d'éviter d'avoir des surprises.
    Je confirme que le awk POSIX de macOS a bien le même comportement.

    C'est ahurissant!
    Qui verrait du premier coup d'oeil que le script suivant est beugué???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for f in *
    do awk '{print FILENAME":"$0}' "$f"
    done
    En fait, avec tes 3 fichiers, il traite le 1er "BAR", puis il attend des données sur la stdin (pour le 2ème "BOB=1"), ce qui donne l'impression qu'il boucle et ne s'arrêtera jamais, puis, si on tape ctrl-D, il passe au 3ème "FOO"...

    Et, effectivement, le même script, sans le bug (y en a p'têt d'autres que j'ai pas vus!!!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for f in ./*
    do awk '{print FILENAME":"$0}' "$f"
    done
    ./BAR:ligne 1
    ./BAR:ligne 2
    ./BOB=1:ligne 1
    ./BOB=1:ligne 2
    ./FOO:ligne 1
    ./FOO:ligne 2

  6. #6
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Bonsoir,
    Citation Envoyé par jack-ft Voir le message
    En fait, avec tes 3 fichiers, il traite le 1er "BAR", puis il attend des données sur la stdin (pour le 2ème "BOB=1"), ce qui donne l'impression qu'il boucle et ne s'arrêtera jamais, puis, si on tape ctrl-D, il passe au 3ème "FOO"...
    awk n'attend rien sur stdin pour "BOB=1", il va seulement affecter la valeur et passer direct au traitement du fichier suivant.
    La variable BOB n'est connue que lors du traitement des fichiers suivant ; lors du traitement des fichiers précédant, la variable n'est pas encore initialisée.

    C'est documenté... Mais vicieux quand on l'oublie !

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    Bonsoir,

    awk n'attend rien sur stdin pour "BOB=1", il va seulement affecter la valeur et passer direct au traitement du fichier suivant.
    La variable BOB n'est connue que lors du traitement des fichiers suivant ; lors du traitement des fichiers précédant, la variable n'est pas encore initialisée.

    C'est documenté... Mais vicieux quand on l'oublie !
    Ici, jack-ft, explique le cas de la boucle for sur les fichiers.
    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ici, jack-ft, explique le cas de la boucle for sur les fichiers.
    Ah OK.
    Désolé jack-ft !

  9. #9
    Membre confirmé
    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
    Points : 539
    Points
    539
    Par défaut
    Salut,
    J'arrive un peu tard mais avec le for in * de jack-ft, j'obtiens bien le résultat escompté ???
    Edit : avec 1 fichier BOB\=1, ça passe
    avec 1 fichier BOB=1 , là ça coince effectivement.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/07/2008, 11h07
  2. lire le nom des fichiers qui se trouvent dans un dossier
    Par foufoulol dans le forum Langage
    Réponses: 6
    Dernier message: 05/05/2008, 11h38
  3. Récupérer le nom du fichier qui a appelé mon programme
    Par newbiedelphi dans le forum Débuter
    Réponses: 3
    Dernier message: 28/04/2008, 22h59
  4. Récupérer le nom du fichier qui appelle une fonction
    Par DeezerD dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2007, 14h37
  5. [C#] Récupérer le nom du fichier qui a lancé l'application
    Par etiennegaloup dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/04/2006, 16h26

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