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 :

[awk] Imprimer tout le champ avec les espaces


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut [awk] Imprimer tout le champ avec les espaces
    Bonjour,

    J'ai un fichier comme ceci:

    nom_plan_comptable;categorie;nomsite;dtecreat
    PC - FORMATION AVANCES;FORMATION AVANCES;FORM. AVANCES 31 046;31/03/2014

    je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for NomSite=`awk 'BEGIN{FS=";"} { print $3 }' $(pwd)/$Fichier`
    do
    echo  "nom = $NomSite \n"
    done
    Voila ce que j'ai comme retour???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom = nomsite 
    nom = FORM. 
    nom = AVANCES 
    nom = 31 
    nom = 046
    J'aimerai avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom = nomsite
    nom = FORM. AVANCES 31 046
    Comment faire?

    Cordialement,
    vandman

  2. #2
    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
    Bonjour,
    La version courte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; '$0="nom = "$3' $(pwd)/$Fichier

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    vandman,

    avec le code donné, tu ne peux pas avoir la sortie que tu prétends être affichée !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    J'ai fait une version édulcoré du code que j'ai, mais c'est ca, et le résultat retourné est celui indiqué sans les sauts de ligne.

    J'ai deux fichiers, un fichier (1) avec une liste du type de ce que j'ai indiqué.
    et un autre fichier (2) que je dois injecter en masse dans le système.
    Pour chaque site dans le fichier1, je dois lancer une commande pour injecter le fichier2.
    L'idee est de lancer la commande pour chaque ligne lu par awk, d'ou le code suivant avec le "for".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for NomSite=`awk 'BEGIN{FS=";"} { print $3 }' $(pwd)/$Fichier`
    do
    echo  "nom = $NomSite \n"
    done
    c'est une version simplifiée sans la commande à lancer.

    Il suffit simplement de mettre à la place du "echo" la commande désirée; pour moi, celle ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande -f FichierAInjecter -n "$NomSite"
    Ca ne fonctionnait pas alors j'ai mis des "echo" partout pour comprendre.

    J'ai lu sur la toile que FS=";" permet de séparer les champs avec le ";" en entrée, ca fonctionne.
    Je ne suis pas sur mais en sortie, le parametre par défaut de awk (OFS) pour séparer les champs est " ". Je pense que le problème viens de la. Comment faire pour que j'ai bien mon champ entier en sortie?
    Je précise que j'ai essayé de mettre OFS=";" mais ca n'a rien changé. De plus, le retour n'est que le contenu d'un champ sans délimiteur. Comment faire pour qu'il ne prenne pas en compte l'espace?

    Cordialement,
    Vandman

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    «je pense» que tu devrais lire un tutoriel pour débutant, afin d'apprendre à faire une boucle for correctement !

    mais surtout Comment lire/parcourir un fichier en shell
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    Merci N_BaH, Le tuto m'a permis de résoudre mon problème. j'ai fait autrement.

    Voici comment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while read -r ligne; do
    	IFS=';'       # séparateur de champ dans le fichier lu
    	set -- $ligne # éclatement de la ligne en paramètre positionnels
     
    	case $3 in
    		"nomsite" ) echo  "Entete de ligne du fichier csv, ne fait rien \n";;
    		* )   # Lance la commande d'injection correspondant à la ligne lu
    		$Commande parametre -f $(pwd)/$Fichier2 -r \"$3\";;
    	esac
    done < $(pwd)/$Fichier1 #fichier lu dans le while

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/05/2006, 09h11
  2. nom de table et de champs avec des espaces
    Par grinder59 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/05/2006, 17h30
  3. [VBS]Problème de chemin avec les " " (espace)
    Par pierre1256 dans le forum VBScript
    Réponses: 3
    Dernier message: 16/02/2006, 18h53
  4. [Winsock] Problème avec les espaces
    Par Fiquet dans le forum Développement
    Réponses: 3
    Dernier message: 12/01/2006, 18h06
  5. Réponses: 4
    Dernier message: 19/10/2005, 11h26

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