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 :

Colonne à largeur fixe


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Par défaut Colonne à largeur fixe
    Bonjour,

    dans un fichier j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    132  ;absdfrh   ;45678    ;gdhtf
    132  ;absdfrh;45678    ;gdhtf
    Donc voici ma question :
    Comment faire pour que ma colonne 2 aie toujours une largeur de 10 ? Mais que la seconde colonne.

    J'ai bien cette commande, mais la largeur résulatante est la même pour toutes les colonnes. Je n'arrive pas à changer pour ne mettre que la seconde colonne de mon fichier.
    If me faudrais surement un "if i=2" dans le awk, mais incapable de le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{ for (i=1; i<=NF; i++) { printf("%-10s", $i); } print ""; }' fic.txt
    Et quoi que pendant que j'y suis ; serait-t-il possible d'avoir ce même genre de chose avec la possibilité de saisir la largeur de chaque colonne ?
    J'ai trouvé cela, mais je ne comprends pas comment l'intégrer ;(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEGIN { widthlist = "20 10 30 12 ..."; split(widthlist,widths," ") } { ... printf "%-*s", widths[i],$i ...

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Bonjour,
    Voici une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'BEGIN{OFS=FS;split("12,20,30,40",A,",")}{i=0;while(++i<=NF)$i=sprintf("%-"A[i]"s",$i)}1' file.txt
    ou par passage de variable (pas testée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    XX="12,20,30,40"
    awk -F\; -vIDT="$XX" 'BEGIN{OFS=FS;split(IDT,A,",")}{i=0;while(++i<=NF)$i=sprintf("%-"A[i]"s",$i)}1' file.txt

  3. #3
    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
    Citation Envoyé par ozzii Voir le message
    dans un fichier j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    132  ;absdfrh   ;45678    ;gdhtf
    132  ;absdfrh;45678    ;gdhtf
    Donc voici ma question :
    Comment faire pour que ma colonne 2 aie toujours une largeur de 10 ? Mais que la seconde colonne.
    Le plus simple, ce serait quand même de demander au producteur du fichier de le mettre au bon format au moment de la production!

    If me faudrais surement un "if i=2" dans le awk, mais incapable de le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{ for (i=1; i<=NF; i++) { printf("%-10s", $i); } print ""; }' fic.txt
    J'ai supposé que tu voulais garder les ";" entre les champs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{ for (i=1; i<=NF; i++) { if ( i == 2) { printf("%-10s", $i); } else { printf("%s", $i); if ( i != NF ) {printf(";")} }} print "" }' fic.txt
    Et quoi que pendant que j'y suis ; serait-t-il possible d'avoir ce même genre de chose avec la possibilité de saisir la largeur de chaque colonne ?
    J'ai trouvé cela, mais je ne comprends pas comment l'intégrer ;(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEGIN { widthlist = "20 10 30 12 ..."; split(widthlist,widths," ") } { ... printf "%-*s", widths[i],$i ...
    Comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' 'BEGIN { widthlist = "20 10 30 12 ..."; split(widthlist,widths," ") } { for (i=1; i<=NF; i++) { printf("%-*s", widths[i],$i); if ( i != NF ) {printf(";")} }; print "" }' fic.txt

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Le plus simple, ce serait quand même de demander au producteur du fichier de le mettre au bon format au moment de la production!
    Oui, mais non. Là on s'attaque à un gros morceau. Dans le fichier il y a "seulement" 1% d'erreur.
    Et faire un changement, c'est comme demandé à Orange de baisser ses prix ; impossible

    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{ for (i=1; i<=NF; i++) { if ( i == 2) { printf("%-10s", $i); } else { printf("%s", $i); if ( i != NF ) {printf(";")} }} print "" }' fic.txt
    Ici le ; après la zone 2 est perdu. J'ai juste rajouté un point virgule ici. Cela à l'aire de faire l'affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%-10s;", $i); }
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' 'BEGIN { widthlist = "20 10 30 12 ..."; split(widthlist,widths," ") } { for (i=1; i<=NF; i++) { printf("%-*s", widths[i],$i); if ( i != NF ) {printf(";")} }; print "" }' fic.txt
    Trop cool.

    Merci jack-ft pour ton aide précieuse

  5. #5
    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
    Citation Envoyé par ozzii Voir le message
    Ici le ; après la zone 2 est perdu. J'ai juste rajouté un point virgule ici. Cela à l'aire de faire l'affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%-10s;", $i); }
    En fait, c'était une erreur de parenthésage (je n'aime pas les commandes multiples sur une seule ligne!!!).
    Je voulais dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{ for (i=1; i<=NF; i++) { if ( i == 2) { printf("%-10s", $i) } else { printf("%s", $i) } if ( i != NF ) {printf(";")} } print "" }' fic.txt

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 8
    Par défaut
    Merci encore @jack-ft

    P.S. : Désolé @disedorgue je ne sais comment j'ai raté ton post
    Merci pour cette solution un peut plus courte.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Le script awk du premier message veut dire: "Pour chaque champ, écrire au moins 10 caractères".

    Donc, changer pour "Pour chaque champ, si le champ est 2 alors écrire au moins 10 caractères" est ridicule. Il fallait enlever (la boucle) et non rajouter (du code).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{$2=printf("%-10s", $2);} 1' fic.txt
    (pas testé)

    Nota bene: 10 caractères, c'est bien, mais ... justifiés à droite ou justifiés à gauche ?

    Ensuite, on peut tiquer car les deux questions posées sont opposées.
    En effet les champs de longueur fixe permettent de s'en sortir avec un fichier sans délimiteur ';'.
    Or le fichier en a !! (des points-virgules)
    Est-ce que tu transformes ton fichier texte pour supprimer les délimiteurs ?
    Sinon, tu avais déjà repéré les champs.
    Bizarre.

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

Discussions similaires

  1. [WD12] Problème de saisie dans une colonne à largeur fixe
    Par tahraz dans le forum WinDev
    Réponses: 0
    Dernier message: 06/01/2014, 09h00
  2. Largeur fixe pour une colonne de GridView
    Par slokix dans le forum ASP.NET
    Réponses: 11
    Dernier message: 26/09/2007, 09h01
  3. Réponses: 3
    Dernier message: 10/05/2007, 14h12
  4. Comment obtenir une colonne de largeur fixe ?
    Par spip68 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 21/09/2006, 18h12
  5. [CSS] 1 table, 3 colonnes, 2 largeurs fixes
    Par lolo_ici_et_la dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 14/06/2006, 20h13

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